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

标签 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 的第 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 and b 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/

相关文章:

javascript - ReactJS - 将 json 插入状态数组

php - 在提交到数据库之前从字符串中提取信息

javascript - 单击 getElementsByClassName 和 where

javascript - 来自 sub 时直接调用其他 super 方法

javascript - 通过添加 span 突出显示文本文档中的字符串

javascript - 如何在 javascript/jquery 中禁用鼠标滚轮平移?

ruby - 按日期排序数组元素

python - 二维数组python中的邻居

c - 按值将数组传递给函数

javascript - 在 Safari 中更改 MediaStream 和 Blob 的视频 srcObject