这似乎令人困惑,但让我解释一下:
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的第四项。两个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]
}
]
我希望您能理解它,我试图尽可能地使之清晰,但是如果您有任何有助于使问题具体化的问题,请提出。而且请不要拒绝投票,告诉我如何改善这个问题。
答案 0 :(得分:1)
您可以检查数组的每一项并返回值的最终增量。
此解决方案的标准排序回调为
(a, b) => a - b
,其数值为
a
和b
并返回其差值。这个想法适用于数字数组,并迭代数组并为每个索引获取增量,并将增量分配给
d
。
Array#some
迭代直到返回truthy值。这里的返回值是增量。这意味着,任何uero值都会导致数组的进一步迭代,直到找到非零值(或者数组中没有更多值)为止。最后,返回最后一个增量。
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);