javascript - 如何过滤对象数组但更改顺序
问题描述
假设我有一个 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));
});
解决方案
您可以通过查找对象来映射想要的项目。
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; }
推荐阅读
- c# - 用户名参数无效-CMOS
- r - 从 R 中具有不同列和长度的两个数据帧中选择并组合行
- javascript - 如何使“Ckeditor-5 文档编辑器”禁用或只读
- python - 使用“matplotlib.pyplot()”绘制数据时出现奇怪的结果
- sql - sql query for row replacing with another row
- mysql - 将大量数据存储为单个 JSON 字段 - 将重要字段提取到自己的字段中?
- php - PHP - 从我实例化我的对象的类中调用一个方法
- javascript - 如何在 n 个对象数组中进行交集?
- javascript - 如何集成 Ionic 4 + AngularJS (1.7.2) + Webpack + Cordova?
- c# - DataGrid 中的 WPF 样式单元格和行