如何按照另一个数组的ID对数组进行排序(lodash / javascript)

3

我希望将我的第二个数组按照第一个数组的 id 属性进行排序。

以下是我的数组

第一个数组

data : 
  items:
    0: {id: 14, attributes: Array(1)}
    1: {id: 8, attributes: Array(1)}
    2: {id: 4, attributes: Array(1)}
    3: {id: 1, attributes: Array(2)}
    4: {id: 2045, attributes: Array(2)}

第二个数组

data : 
  items:
    0: {id: 1, name: "test Product 1"}
    1: {id: 4, name: "test Product 1"}
    2: {id: 8, name: "test Product 1"}
    3: {id: 14, name: "test Product 1"}
    4: {id: 2045, name: "test Product 1"}

我尝试了这样做:

Javascript - sort array based on another array

但是好像无法让它正常工作。 我知道这个问题已经被问得很多了,但我就是想不出来。

data.items.sort( (a,b) => a.id - b.id ); - gurvinder372
第二个数组已经按id排序了吗? - gurvinder372
是的,但我希望它像第一个数组那样排序。 - MePo
2个回答

8

lodash

sorted = _.sortBy(items1, x => _.findIndex(items2, y => x.id === y.id))

如果您的数组长度较长,建议先构建索引,然后再按照该索引进行排序。
index = _.fromPairs(_.map(items2, (x, i) => [x.id, i]));
sorted = _.sortBy(items1, x => index[x.id])

我之前也考虑过类似的方案,但是没想出来。谢谢你向我展示了更高效的方法。 - MePo

3
您可以按照第一个数组的索引进行排序。
items2.sort((a, b) =>
    items1.findIndex(({ id }) => a.id === id) -
    items1.findIndex(({ id }) => b.id === id));

var items1 = [{ id: 14, attributes: [1] }, { id: 8, attributes: [1] }, { id: 4, attributes: [1] }, { id: 1, attributes: [1] }, { id: 2045, attributes: [1, 2] }],
    items2 = [{ id: 1, name: "test Product 1" }, { id: 4, name: "test Product 1" }, { id: 8, name: "test Product 1" }, { id: 14, name: "test Product 1" }, { id: 2045, name: "test Product 1" }];

items2.sort((a, b) => items1.findIndex(({ id }) => a.id === id) - items1.findIndex(({ id }) => b.id === id));

console.log(items2);
.as-console-wrapper { max-height: 100% !important; top: 0; }


由于我已经在使用lodash,所以我接受了Georg的答案。但是非常感谢你的回答,很有帮助,可以看到没有使用lodash的方法。 - MePo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接