首页 > 解决方案 > 如何过滤对象数组但更改顺序

问题描述

假设我有一个 objects[] 数组和一个数字数组。

let objects = [
{name: apple, id:1},
{name: banana, id:2},
{name: orange, id:5}
];

let numbers = [5, 1];

我想过滤对象数组,所以只保留与数字匹配的id,并且应该更改顺序以匹配数字数组。

result should be [{name: orange, id:5} , {name: apple, id:1} ]

我可以用javascript对象原型来做吗?或者我可以使用 lodash 之类的 3rd 方工具吗?

我试过下面的代码,但它保持原始列表的顺序:

result = object.filter(p => {
    return numbers.includes(parseInt(p.id));
});

标签: javascriptarraysecmascript-6

解决方案


您可以通过查找对象来映射想要的项目。

var objects = [{ name: 'apple', id: 1 }, { name: 'banana', id: 2 }, { name: 'orange', id: 5 }],
    numbers = [5, 1],
    result = numbers.map(id => objects.find(o => o.id === id));

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

查找和重新排序的规范解决方案可能是使用哈希表或Map使用 O(1) 的 fas 访问并映射想要的部分。

例如,这里通过移交原始数据数组、所需值数组和密钥来抽象密钥的解决方案。

const
    getObjects = (data, values, key) => values.map(
        Map.prototype.get,
        objects.reduce((m, o) => m.set(o[key], o), new Map)
    ),
    objects = [{ name: 'apple', id: 1 }, { name: 'banana', id: 2 }, { name: 'orange', id: 5 }],
    values = ['banana', 'apple', 'orange'],
    result = getObjects(objects, values, 'name');

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


推荐阅读