如何根据另一个对象对对象数组进行排序?

时间:2020-12-28 20:30:51

标签: javascript arrays sorting object

我有这些数组:

数组 1:

const arr1 = [
  {_id: "13", qtde: 1, color: "red", size: "100x100"},
  {_id: "16", qtde: 5, color: "green", size: "200x200"},
  {_id: "1", qtde: 3, color: "yellow", size: "300x300"},
  {_id: "23", qtde: 2, color: "purple", size: "500x500"},
  {_id: "3", qtde: 0, color: "orange", size: "200x200"}
]

数组 2:

const arr2 = [
  {_id: "23", name: "Produto-23", price: "48.99"},
  {_id: "13", name: "Produto-13", price: "58.99"},
  {_id: "3", name: "Produto-3", price: "58.99"},
  {_id: "1", name: "Produto-1", price: "58.99"},
  {_id: "16", name: "Produto-16", price: "58.99"}
]

预期输出:

const arr2 = [
  {_id: "13", name: "Produto-13", price: "58.99"},
  {_id: "16", name: "Produto-16", price: "58.99"},
  {_id: "1", name: "Produto-1", price: "58.99"},
  {_id: "23", name: "Produto-23", price: "48.99"},
  {_id: "3", name: "Produto-3", price: "58.99"}
]

可以看出它们是不同的,但它们具有共同的属性 _id,但顺序不同。我想要做的是根据其属性 _id 重新组织第二个数组,使其与第一个数组具有相同的顺序。

为了清楚起见,除了第二个数组的顺序之外,我不想合并数组或更改任何内容。

我考虑过使用 Array.sort,但由于我没有引用属性,我不知道如何将其应用于此处。基本思想是使用第一个数组的索引作为参考,因为它不会改变,但我不知道如何。

我怎么能这样做?

2 个答案:

答案 0 :(得分:3)

您可以在 .findIndex 中使用 sort,如下所示:

const arr1 = [
  {_id: "13", qtde: 1, color: "red", size: "100x100"},
  {_id: "16", qtde: 5, color: "green", size: "200x200"},
  {_id: "1", qtde: 3, color: "yellow", size: "300x300"},
  {_id: "23", qtde: 2, color: "purple", size: "500x500"},
  {_id: "3", qtde: 0, color: "orange", size: "200x200"}
]
const arr2 = [
  {_id: "23", name: "Produto-23", price: "48.99"},
  {_id: "13", name: "Produto-13", price: "58.99"},
  {_id: "3", name: "Produto-3", price: "58.99"},
  {_id: "1", name: "Produto-1", price: "58.99"},
  {_id: "16", name: "Produto-16", price: "58.99"}
]

const arr2Sorted = arr2.sort((a,b) => {
  const indexOfA = arr1.findIndex(e => e._id === a._id);
  const indexOfB = arr1.findIndex(e => e._id === b._id);
  return indexOfA - indexOfB;
});

console.log(arr2Sorted);

答案 1 :(得分:3)

您需要从第一个数组创建一个查找映射,然后使用查找映射对另一个数组进行排序。

const createLookup = (arr, key) =>
  arr.reduce((acc, curr, index) =>
    ({ ...acc, [curr[key]]: index }), {});

const sortWithLookup = (arr, key, lookup) =>
  arr.sort((a, b) => lookup[a[key]] - lookup[b[key]]);

const arr1 = [
  { _id: "13", qtde: 1, color: "red",    size: "100x100" },
  { _id: "16", qtde: 5, color: "green",  size: "200x200" },
  { _id:  "1", qtde: 3, color: "yellow", size: "300x300" },
  { _id: "23", qtde: 2, color: "purple", size: "500x500" },
  { _id:  "3", qtde: 0, color: "orange", size: "200x200" }
];

const arr2 = [
  { _id: "23", name: "Produto-23", price: "48.99" },
  { _id: "13", name: "Produto-13", price: "58.99" },
  { _id:  "3", name: "Produto-3",  price: "58.99" },
  { _id:  "1", name: "Produto-1",  price: "58.99" },
  { _id: "16", name: "Produto-16", price: "58.99" }
];

const lookup = createLookup(arr1, '_id');
const sorted = sortWithLookup(arr2, '_id', lookup);

sorted.forEach(item => console.log(JSON.stringify(item)));
.as-console-wrapper { top: 0; max-height: 100% !important; }