javascript - 如何过滤对象数组但更改顺序

标签 javascript arrays ecmascript-6

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

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 对象原型(prototype)来做吗?或者我可以使用像 lodash 这样的第三方工具吗?

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

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

最佳答案

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

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) 并映射所需的部分。

例如,这里有一个通过传递原始数据数组、所需值数组和 key 来抽象 key 的解决方案。

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; }

关于javascript - 如何过滤对象数组但更改顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53648296/

相关文章:

php - 写入多维数组的位置

arrays - 对几乎已排序的数组进行排序(元素错放不超过 k)

java - 在具有两个缺失值的整数数组中找到 2 个缺失的数字

javascript - 为什么 Jest 会给出 ReferenceError?

javascript - 使用字符串中数组的每个元素组成标准化的句子

ecmascript-6 - 是否可以在对象上而不是数组上使用 ES6 For..Of?

javascript - 图像在 Canvas 中的位置不正确

javascript - 产品详细信息页面上的 Facebook 错误(使用 Send to Messenger 插件)

JavaScript 代码在 jQuery load() 之后不影响 div

javascript - 用 jQuery 动态控制一个旋钮