我有一个数组,如下所示:
var arrOne = [{id: 3},{id: 8},{id: 12}];另一个数组如下所示:
var arrTwo = [
{id: 1, val: 'Adam'},
{id: 3, val: 'Bailey'},
{id: 8, val: 'Cathy'},
{id: 12, val: 'David'},
{id: 15, val: 'Earl'}
];我想基于arrTwo迭代arrOne,并从arrTwo中获取val值。因此,结果应该是:
var result = ['Bailey', 'cathy', 'David'];尝试将.map与.filter连接:
arrOne.map(arOne => arrTwo.filter(artwo => {
if(arOne.id === artwo.id) {
return artwo.val
} else {
return false;
}
}));但它给了我一切,在它是假的地方,它在那里增加了假,我不想要。任何我出错的想法都会被感激的。
按norbitrial的回答编辑:
const arrOne = [{id: 3},{id: 8},{id: 12}];
const arrTwo = [
{id: 1, val: 'Adam'},
{id: 3, val: 'Bailey'},
{id: 8, val: 'Cathy'},
{id: 12, val: 'David'},
{id: 15, val: 'Earl'}
];
const result = arrOne.map(({id}) => arrTwo.find(e => {
const someCond = someConditionaEval();
if(someCond && e.id === id) {
return e;
} else {
return false;
}
}).val); //this breaks发布于 2020-04-18 17:15:52
发布于 2020-04-18 17:17:26
您可以在arrTwo上使用arrTwo方法,然后使用.includes()方法从arrTwo获取过滤对象,然后使用.map()只从每个筛选对象获取val属性值,如下所示:
var arrOne = [{id: 3},{id: 8},{id: 12}];
var arrTwo = [{id:1,val:"Adam"},{id:3,val:"Bailey"},{id:8,val:"Cathy"},{id:12,val:"David"},{id:15,val:"Earl"}];
var result = arrTwo.filter(a => arrOne.map(o=>o.id).includes(a.id)).map(o=>o.val)
console.log( result )
发布于 2020-04-18 17:19:25
通过val id从arrTwo创建一个地图,然后映射arrOne,然后使用id从地图中提取val。
为什么我更喜欢创建一个映射/字典(对象)而不是使用Array.map()和Array.find()
例如,由于复杂性-- Array.map() with Array.find()是O(n * m),同时创建一个映射,然后使用Array.map()获取值是O(n + m)。但是,如果您有两个小数组,这实际上不应该损害实际性能。
const arrOne = [{id: 3},{id: 8},{id: 12}];
const arrTwo = [{id: 1, val: 'Adam'}, {id: 3, val: 'Bailey'}, {id: 8, val: 'Cathy'}, {id: 12, val: 'David'}, {id: 15, val: 'Earl'}];
const valById = new Map(arrTwo.map(({ id, val }) => [id, val]));
const result = arrOne.map(o => valById.get(o.id));
console.log(result);
https://stackoverflow.com/questions/61293160
复制相似问题