根据数组对象对数组对象进行排序

时间:2018-06-19 16:37:24

标签: javascript arrays

这似乎令人困惑,但让我解释一下:

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]
      }
    ]

我希望您能理解它,我试图尽可能地使之清晰,但是如果您有任何有助于使问题具体化的问题,请提出。而且请不要拒绝投票,告诉我如何改善这个问题。

1 个答案:

答案 0 :(得分:1)

您可以检查数组的每一项并返回值的最终增量。

  

此解决方案的标准排序回调为

(a, b) => a - b
     

,其数值为ab并返回其差值。

     

这个想法适用于数字数组,并迭代数组并为每个索引获取增量,并将增量分配给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);