这可能看起来令人困惑,但让我解释一下:
var a = [
{
id: 1,
sortingArray: [2, 1, 1, 1]
},
{
id: 2,
sortingArray: [2, 1, 2]
},
{
id: 3,
sortingArray: [2, 1, 1, 2]
},
{
id: 4,
sortingArray: [2, 3, 1]
},
{
id: 5,
sortingArray: [2, 2]
},
{
id: 6,
sortingArray: [2, 3, 2]
}
]
所需的方法是这样的:循环遍历数组 a 的每个项目,并循环遍历 sortingArrays 中的项目。我可以这样想象工作方法:遍历 a 的元素,然后检查它们的第一项 sortingArrays。每一项都是等价的,因为每一项的sortingArray的第一项都是2。
然后,循环遍历 sortingArray 的每个项目的第二个项目。在这里,情况有所不同,因为排序必须改变。 id 1、2、3 保持原来的位置,但 id 4 和 id 5 改变了位置。然后,转到每个元素的 sortingArray 的第三个元素。这里id 2和3换了地方,因为id:3的sortingArray的第三项是1,而id:2的sortingArray的第三项是2。
这是一件重要的事情。 id: 5 的 sortingArray 没有第三项。这意味着 id: 5 将 100% 排在第四位。然后是 sortingArray 的第 4 项。 id: 2、4 和 6 都没有第四项,因此它们将保留在它们的位置上。 id: 1 和 id: 2 也保留它的位置,因为它们已经在正确的位置。循环结束,因为每个项目的 sortingArray.length 的 Math.max 都是 4(因为 id: 1 和 id: 3)。
所以预期的结果是这样的:
var a = [
{
id: 1,
sortingArray: [2, 1, 1, 1]
},
{
id: 3,
sortingArray: [2, 1, 1, 2]
},
{
id: 2,
sortingArray: [2, 1, 2]
},
{
id: 5,
sortingArray: [2, 2]
},
{
id: 4,
sortingArray: [2, 3, 1]
},
{
id: 6,
sortingArray: [2, 3, 2]
}
]
最佳答案
您可以检查数组的每一项并返回值的最终增量。
This solution features the standard sorting callback of
(a, b) => a - b
which takes a numerical value of
a
andb
and returns the delta of it.This idea is taken for arrays of numbers and iterates the arrays and takes the delta for each index and assigns the delta to
d
.
Array#some
iterates until a truthy value is returned. The return value here is the delta. That means, any uero value leads to a further iteration of the arrays until a non zero value is found (or the array has no more values).Finally, the last delta is returned.
var array = [{ id: 1, sortingArray: [2, 1, 1, 1] }, { id: 2, sortingArray: [2, 1, 2] }, { id: 3, sortingArray: [2, 1, 1, 2] }, { id: 4, sortingArray: [2, 3, 1] }, { id: 5, sortingArray: [2, 2] }, { id: 6, sortingArray: [2, 3, 2] }]
array.sort(({ sortingArray: a }, { sortingArray: b }) => {
var d;
a.some((v, i) => d = v - b[i]);
return d;
});
console.log(array);
如果需要,您可以将数组标准化为相同的长度。
var array = [{ id: 1, sortingArray: [2, 1, 1, 1] }, { id: 2, sortingArray: [2, 1, 2] }, { id: 3, sortingArray: [2, 1, 1, 2] }, { id: 4, sortingArray: [2, 3, 1] }, { id: 5, sortingArray: [2, 2] }, { id: 6, sortingArray: [2, 3, 2] }]
array.sort(({ sortingArray: a }, { sortingArray: b }) => {
var d;
while (a.length < b.length) a = a.concat(0);
while (b.length < a.length) b = b.concat(0);
a.some((v, i) => d = v - b[i]);
return d;
});
console.log(array);
关于javascript - 根据数组对数组对象进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50933157/