使用另一个数组对固定对象数组进行排序

3
我有一个变量,用于定义对象的顺序,如下所示:
const order = ['large', 'medium', 'small'];

我想使用“order”数组中的名称来匹配数据数组对象的顺序:
const data = [{name: "small", children: []}, {name: "medium", children: []}, {name: "large", children: []}]

因此,效果应该如下:

const data = [{name: "large", children: []}, {name: "medium", children: []}, {name: "small", children: []}]

我该如何实现这个?

1
你可以使用自定义排序函数,比较匹配单词在顺序数组中的索引。 - Webber
5个回答

4
我们可以通过使用订单数组中name的索引来实现此操作:

const order = ['large', 'medium', 'small'];
const data = [{name: "small", children: []}, {name: "medium", children: []}, {name: "large", children: []}];

const sortArray = (arr, order) => {
  return data.sort((a, b) => order.indexOf(a.name) - order.indexOf(b.name)); 
}
console.log(sortArray(data, order));


2

使用 lodash

_(data).sortBy([(x) => {
    return order.findIndex(y => y.name === x.name);
}]).value();

1
我建议使用以下代码: data = data.sort(item => order.indexOf(item.name)) 或者 data = data.sort(item => -order.indexOf(item.name)) 这些代码与数据排序相关。

1
你可以使用自定义的排序函数,比较匹配单词在顺序数组中的索引。类似以下内容:

const order = ['large', 'medium', 'small'];
const data = [{name: "small", children: []}, {name: "medium", children: []}, {name: "large", children: []}]

const result = data.sort((a, b) => order.indexOf(a) < order.indexOf(b) ? 1 : -1);

console.log(result)


1
如果您的实际数组很大,则尽量避免在每次调用sort回调函数时进行扫描,因为这将意味着算法具有O(n²logn)的时间复杂度。如果您首先将顺序信息转换为映射(可能是普通对象的形式),并使用桶排序,则可以在线性时间内完成:

const order = ['large', 'medium', 'small'];
const data = [{name: "small", children: []}, {name: "medium", children: []}, {name: "large", children: []}];


// preprocessing  O(n)    
const map = Object.fromEntries(order.map((key, i) => [key, i]));
let result = order.map(() => []);
// bucket sort  O(n)
for (let obj of data) result[map[obj.name]].push(obj);
// flatten O(n)
result = result.flat();
console.log(result);


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