gpt4 book ai didi

javascript - 基于java脚本中嵌套对象数组中的键对列表进行排序的最佳方法

转载 作者:数据小太阳 更新时间:2023-10-29 04:42:21 24 4
gpt4 key购买 nike

我有以下内容:

var list = [
{"item":[{a:5, a1:6, a2:7}, {b:3, b1:4, b2:2}]},
{"item":[{a:1, a1:2, a2:3}, {b:4, b1:5, b2:6}]},
{"item":[{a:2, a1:7, a2:4}, {b:3, b1:7, b2:1}]}
];

假设我有上面的变量 list,我怎样才能对它进行排序,使得 list 中具有 item 键的所有直接对象> 根据键(即 "a1""b")按升序排序。请注意,它不会更改或重新排序 list[x]["item"] 中的列表,而只会更改 list[x] 中的直接项目。

标准排序函数似乎只对数组中对象内的键进行排序,但我想根据位于数组中嵌套对象中的键进行排序。

最好的排序方式是什么?

最佳答案

所以您的主要问题是您需要在内部 item 数组中找到一个具有匹配属性的对象。因为你不知道它将位于什么对象上。请注意,这里的一个限制是您将始终在第一个找到的实例上进行比较,即使 item 中的多个对象拥有比较属性。开始了:

var list = [
{"item":[{a:5, a1:6, a2:7}, {b:3, b1:4, b2:2}]},
{"item":[{a:1, a1:2, a2:3}, {b:4, b1:5, b2:6}]},
{"item":[{a:2, a1:7, a2:4}, {b:3, b1:7, b2:1}]}
];

function comparatorMaker(prop) {
var findVal = function(acc, obj) {
return acc || obj[prop];
};

return function(x, y) {
if (!x.item && !y.item) return 0;
if (x.item && !y.item) return -1;
if (!x.item && y.item) return 1;

var xVal = x.item.reduce(findVal, null) || 0;
var yVal = y.item.reduce(findVal, null) || 0;

return (xVal === yVal) ? 0 : (xVal > yVal) ? 1 : -1;
};
}

var myComparator = comparatorMaker('a');

list.sort(myComparator); // element 1, element 2, element 0

这里发生的是我们为给定的属性名称生成一个唯一的比较器函数。它现在可以与任何:

var myComparator = comparatorMaker('b1');

list.sort(myComparator); // element 0, element 1, element 2

我们在制作比较函数时定义的 findVal 函数与 item.reduce 一起使用。缩减遍历 item 的内容并返回已经找到的值或在当前正在检查的元素上查找值。实际上,这可以更有效地完成,因为即使我们立即找到匹配项,我们最终也会迭代 item 中的每个元素,但需要更多代码行来证明这一点,所以我保持简单。

比较器本身应返回 1、0 或 -1,具体取决于结果值是大于-小于、等于还是小于-大于。比较函数的前几行只是为了处理 list 中的元素实际上没有 item 属性的情况,因为你表达问题的方式听起来像有时可能是这种情况。

关于javascript - 基于java脚本中嵌套对象数组中的键对列表进行排序的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26415675/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com