Javascript 重新排序JSON对象中的数据

Javascript 重新排序JSON对象中的数据,javascript,json,Javascript,Json,考虑以下Javascript对象和代码: Javascript对象 { "thing":{ "data":"some data", "thumb":"some data", "data1":"some data", "data2":"some data", "data3":"some data", }, "extra1":[ { "extradata1":"some d

考虑以下Javascript对象和代码:

Javascript对象

{
    "thing":{
       "data":"some data",
       "thumb":"some data",
       "data1":"some data",
       "data2":"some data",
       "data3":"some data",
    },
    "extra1":[
       {
          "extradata1":"some data",
          "extradata2":"some data",
          "extradata3":"some data",
          "extradata4":"some data"
       },
       {
          "extradata1":"some data",
          "extradata2":"some data",
          "extradata3":"some data",
          "extradata4":"some data"
       }
    ],
    "extra2":[
       {
          "hightlighted": false, 
          "extradata2":"some data",
       },
       {
          "hightlighted": false, 
          "extradata2":"some data",
       },
       {
          "hightlighted": true, 
          "extradata2":"some data",
       },
       {
          "hightlighted": false, 
          "extradata2":"some data",
       }
     ]
}
我想根据值是否为真在'extr2'中查找一个对象,将其删除并将其添加回同一个json对象中,但位于'extr2'对象的顶部

目前我的想法是:

for (var i=0; i<object.extra2.length; i++){
        if (object.extra2[i].highlighted === true) {
            highlightStore = object.extra2[i];
            delete object.extra2[i]
            object.extra2.push(highlightStore)
        }
    }
然而,我似乎无法使这项工作正常进行

问题在于:

object.extra2.push(highlightStore)
array方法将一个或多个元素添加到数组的末尾,但由于需要在顶部添加项,只需使用array方法,如:

object.extra2.unshift(highlightStore)
由于unshift方法将一个或多个元素添加到数组的开头。

问题在于:

object.extra2.push(highlightStore)
array方法将一个或多个元素添加到数组的末尾,但由于需要在顶部添加项,只需使用array方法,如:

object.extra2.unshift(highlightStore)

由于unshift方法将一个或多个元素添加到数组的开头。

另一种可能是使用hightlighted属性对相关数据进行排序。注意拼写错误。这大概应该得到强调。可能是这样的:

const object={thing:{data:some data,thumb:some data,data1:some data,data2:some data},extra1:[{extradata1:some data,extradata2:some data,extradata3:some data,extradata4:some data},{extradata1:some data,extradata2:some data,extradata3:some data,extradata4:some data}],extra2:[{hightlighted:false,extradata2:some data},{hightlighted:false,extradata2:some data},{hightlighted:true,extradata2:some data},{hightlighted:false,extradata2:some data} object.extra2.sort{hightlighted:h1},{hightlighted:h2}=> h1&&!h2?-1:h2&&!h1?1:0 控制台日志对象
.as console wrapper{min height:100%!important;top:0}另一种可能是使用hightlighted属性对相关数据进行排序。请注意拼写错误。这可能应该突出显示。可能如下所示:

const object={thing:{data:some data,thumb:some data,data1:some data,data2:some data},extra1:[{extradata1:some data,extradata2:some data,extradata3:some data,extradata4:some data},{extradata1:some data,extradata2:some data,extradata3:some data,extradata4:some data}],extra2:[{hightlighted:false,extradata2:some data},{hightlighted:false,extradata2:some data},{hightlighted:true,extradata2:some data},{hightlighted:false,extradata2:some data} object.extra2.sort{hightlighted:h1},{hightlighted:h2}=> h1&&!h2?-1:h2&&!h1?1:0 控制台日志对象
.作为控制台包装器{min height:100%!important;top:0}我不会对原始数据进行变异,这始终是个坏主意,因此您不希望使用诸如push、shift等变异方法

创建新变量以保存原始文件的部分和/或转换副本

在您的特定情况下,您可以:

const extra2sorted=[…data.extra2.filterv=>v.hightlighted,…data.extra2.filterv=>!v.hightlighted]
我不会对原始数据进行变异,这始终是一个坏主意,因此您不希望使用诸如push、shift等变异方法

创建新变量以保存原始文件的部分和/或转换副本

在您的特定情况下,您可以:

const extra2sorted=[…data.extra2.filterv=>v.hightlighted,…data.extra2.filterv=>!v.hightlighted]
排序之所以重要,有什么具体原因吗?据我所知,JSON在数据顺序上有点像angoistic。另外,extra2是一个数组,而不是api交付的对象,我希望在前端根据每个对象中给出的标志对其进行正确排序。它是一个对象数组,不是JSON对象。它们是JavaScript objects.JSON是一种序列化方案。无论如何,JavaScript对象属性有一个由运行时控制的顺序,但你不能以任何直接的方式来控制。依赖属性顺序是一个非常容易出现错误的想法。有什么具体的原因说明顺序很重要吗?据我所知,JSON在数据顺序上有点不协调。另外,extra2是一个数组,不是api交付的对象,我想根据每个对象中给定的标志在前端对其进行正确排序。它是一个对象数组,不是JSON对象。它们是JavaScript对象。JSON是一个序列化方案。无论如何,JavaScript对象属性的排序由runt控制IME,但是你不能以任何直接的方式控制它。依赖于属性排序是一个严重的bug倾向。哇!这是我想做的,但是我不明白这里到底发生了什么……我以前见过Svelt文档中提到的……语法,我还没有完全理解V.强调的PAR发生了什么。t、 。如果你有时间解释的话,那就太好了。。不管怎样,非常感谢!语法一点也不特定于Svelte,它是Javascript的一部分,最好称为
Spread语法及其相关的近亲是Rest语法。有关更深入的说明,请参阅。Array.filter方法根据给定谓词过滤数组,计算结果为true的元素被保留或为false的元素被拒绝。因此,我们在这里所做的是连接两个过滤数组:在第一个数组中,所有元素的hightlighted属性设置为true,因此元素v的过滤谓词为v.hightlighted,在第二个数组中,它是第一个all的补充元素的hightlighted属性设置为false,因此元素v的筛选器谓词为!v、 hightlighted-如果hightlighted为false,则其计算结果为true。最后,这只是一种基于布尔属性对数组进行排序的快速方法。哇!这就是我想做的,但我不知道这里到底发生了什么。。我看过。。。前面的svelte文档中提到的语法,我也不完全理解v.highlighted部分发生了什么。。如果你有时间解释的话,那就太好了。。不管怎样,非常感谢!这个语法一点也不特定于Svelte,它是Javascript的一部分,更广为人知的是Spread语法及其相关的兄弟Rest语法。有关更深入的说明,请参阅。Array.filter方法根据给定谓词过滤数组,计算结果为true的元素被保留或为false的元素被拒绝。因此,我们在这里所做的是连接两个过滤数组:在第一个数组中,所有元素的hightlighted属性设置为true,因此元素v的过滤谓词为v.hightlighted,在第二个数组中,它是第一个all的补充元素的hightlighted属性设置为false,因此元素v的筛选器谓词为!v、 hightlighted-如果hightlighted为false,则其计算结果为true。最后,这只是一种基于布尔属性对数组进行排序的快速方法。