正在寻找一种在javascript中对对象数组进行排序的方法
因此,我有一个JSON数组,如下所示:正在寻找一种在javascript中对对象数组进行排序的方法,javascript,arrays,json,sorting,lodash,Javascript,Arrays,Json,Sorting,Lodash,因此,我有一个JSON数组,如下所示: [ { row: [ { boat: { description: 'Books', version: '2', id: 6 }, airplanes: [ { airplane: [ { description: 'DVD
[
{
row: [
{
boat: {
description: 'Books',
version: '2',
id: 6
},
airplanes: [
{
airplane: [
{
description: 'DVD',
version: 2,
uid: 69,
wid: 65,
id: 84
}
],
trains: {
train: [
{
description: 'Pictures',
version: 2,
id: 149
}
],
actions: [
{
description: 'This is a really long sentence.',
version: 2,
tid: 69.01,
id: 452
},
{
description: 'article 2',
version: 2,
tid: 69.02,
id: 453
},
{
description: 'developer 1',
version: 2,
tid: 69.03,
id: 454
}
]
}
},
{
airplane: [
{
description: 'Games',
version: 2,
uid: 65,
wid: 61,
id: 80
}
],
trains: {
train: [
{
description: 'another great descriptions.',
version: 2,
id: 145
}
],
actions: [
{
description: 'being indecisive is good.',
version: 2,
tid: 65.01,
id: 442
},
{
description: 'couches are comfortable',
version: 2,
tid: 65.02,
id: 443
}
]
}
}
]
}
]
}
]
我试图按“wid”按升序对上述输出进行排序,但仍然能够保持整体顺序。例如,在上面的示例中,数组元素0中的wid为65,数组元素1中的wid值为61。因此,应该交换元素1和元素0。是否有任何内置javascript方法可以像这样对json进行排序
我的json数组输出将比提供的示例大得多。我建议使用优秀的命令行json处理器。非常快,因为它是用便携式C编写的。易于理解
cat|jq-s
我建议使用优秀的命令行JSON处理器。非常快,因为它是用便携式C编写的。易于理解
cat|jq-s
下划线和LoDash都有一种排序方法,可以满足您的需要。在本例中,我假设您将显示的数据结构存储在名为data
的变量中
_.each(data, function(obj) {
_.each(obj.row, function(row) {
// note the reassignment, _.sortBy does not sort in-place
row.airplanes = _.sortBy(row.airplanes, function(airplane) {
return airplane.wid; // This will sort ascending.
// To sort descending, simply multiply by -1
});
});
});
那么这是在做什么?它将获取根数据结构中的每个数组元素并在其上循环(这是第一个。.each
)。然后在每个对象中,它在每个行
元素上循环,并通过每个元素中包含的wid
元素对行进行排序
希望这对你有帮助。顺便说一句,您发布的数据完全是无效的JSON。每个键都应该是双引号,即“行”
,而不仅仅是行
,单引号对于分隔字符串无效,即“DVD”
而不是“DVD”
。另外,您的boat
版本是一个字符串,而您的其他版本标识符是整数,最好尝试将您的版本标识符保留为整数。下划线和LoDash都有一个排序方法,可以满足您的要求。在本例中,我假设您将显示的数据结构存储在名为data
的变量中
_.each(data, function(obj) {
_.each(obj.row, function(row) {
// note the reassignment, _.sortBy does not sort in-place
row.airplanes = _.sortBy(row.airplanes, function(airplane) {
return airplane.wid; // This will sort ascending.
// To sort descending, simply multiply by -1
});
});
});
那么这是在做什么?它将获取根数据结构中的每个数组元素并在其上循环(这是第一个。.each
)。然后在每个对象中,它在每个行
元素上循环,并通过每个元素中包含的wid
元素对行进行排序
希望这对你有帮助。顺便说一句,您发布的数据完全是无效的JSON。每个键都应该是双引号,即“行”
,而不仅仅是行
,单引号对于分隔字符串无效,即“DVD”
而不是“DVD”
。另外,您的boat
版本是一个字符串,而您的其他版本标识符是整数,最好尝试将您的版本标识符保留为整数。FYI,您拥有的是一个对象数组,而不是JSON。是指定的数据格式。对于此类特定场景,没有内置方法。你必须自己写逻辑。或者也许有一些方法可以帮助你。不知道,我不使用lodash。没有内置的方式,但您可以在JavaScript中设置创建自定义排序函数,并在要在对象内排序的对象数组(可能是airplanes
数组)上使用它。下面是一个自定义排序的示例:仅供参考,这里有一个对象数组,而不是JSON。是指定的数据格式。对于此类特定场景,没有内置方法。你必须自己写逻辑。或者也许有一些方法可以帮助你。不知道,我不使用lodash。没有内置的方式,但您可以在JavaScript中设置创建自定义排序函数,并在要在对象内排序的对象数组(可能是airplanes
数组)上使用它。下面是一个自定义排序的示例:出于某种原因,我尝试了您在上提出的方法,它没有对返回的结果进行排序(请参阅控制台输出)。我做了一个console.log(row.airplanes);这不是我应该做的吗?我假设row.飞机会返回正确的输出?或者它会自动更新“数据”数组吗?我解决了我的问题,在我的JSFIDLE中添加了lodash.js和下划线.js CDN。根据你的回答,我想我两样都需要。在意识到是这样或那样之后。我删除了underline.js并将u.each更改为u.forEach,现在它似乎可以正常工作。谢谢你给我指出了正确的方向。@adbarads编辑了答案,使之更清楚,thanks@adbarads此外,许多lodash函数都有别名(为underline.js提供插入替换功能),因此u0.each和0.forEach都是相同的函数。出于某种原因,我尝试了您在上建议的方法,它没有对返回的结果进行排序(请参阅控制台输出)。我做了一个console.log(row.airplanes);这不是我应该做的吗?我假设row.飞机会返回正确的输出?或者它会自动更新“数据”数组吗?我解决了我的问题,在我的JSFIDLE中添加了lodash.js和下划线.js CDN。根据你的回答,我想我两样都需要。在意识到是这样或那样之后。我删除了underline.js并将u.each更改为u.forEach,现在它似乎可以正常工作。谢谢你给我指出了正确的方向。@adbarads编辑了答案,使之更清楚,thanks@adbarads此外,许多lodash函数都有别名(为underline.js提供插入替换功能),因此u0.each和0.forEach都是相同的函数。