我有这个数组
const array = [1, 3, 6];
和这个物体
const obj = {
1: {id: 1, foo: 'a', ...},
2: {id: 2, foo: 'b', ...}
3: {id: 3, foo: 'c', ...},
4: {id: 4, foo: 'd', ...},
5: {...},
6: {...}
... // up to 1000 key/value paris
};
我想知道如何用obj
中的键过滤array
。
一种方法是
obj.filter(elem => elem.id...);
但是,尽管obj
中只有三个元素,但这仍然会遍历array
中的所有元素。
最好是遍历array
,但是
array.filter(elem => elem === obj.id ...);
然后仅返回array
(即1, 3, 6
)中的元素。
我需要的是一个看起来像
const result = ['s', 'b', 'c', 'd'];
最好的方法是什么?
答案 0 :(得分:6)
您可以映射到数组并从对象内部返回键foo
const res = array.map(elem => obj[elem].foo);
如果对象中不存在所有元素,则可以添加过滤条件以删除未定义的值
const res = array.map(elem => obj[elem] &&obj[elem].foo).filter(Boolean);
答案 1 :(得分:4)
如果您将id
作为键,则可以通过过滤键以仅获取已知键来映射所需的值,然后映射该值。
const
array = [1, 3, 6],
object = { 1: { id: 1, foo: 'bar' }, 2: {}, 3: { id: 3, foo: 'foo' }, 4: {}, 5: {} },
result = array
.filter(Object.hasOwnProperty.bind(object))
.map(id => object[id].foo);
console.log(result);
答案 2 :(得分:1)
如果array
中的所有值都存在于obj
中,则使用Array.map;否则,如果obj
中缺少条目,则可以使用Array.reduce
const array = [1, 3, 6];
const obj = {1: {id: 1, foo: 'bar'},2: {id: 2, foo: 'foo'}};
const result = array.reduce((a,c) => obj[c] ? a.concat(obj[c].foo) : a, []);;
console.log(result);
答案 3 :(得分:0)
您不需要迭代所有只需要检查键是否存在的对象,如果键存在,则将foo值推送到结果数组 这是代码:
const array = [1, 3, 6];
const obj = {
1: {id: 1, foo: 'bar'},
2: {id: 2, foo: 'foo'},
3: {},
4: {},
5: {},
6: {}
};
let result = [];
array.forEach((el) => {
if(obj.hasOwnProperty(el)){
result.push(obj[el].foo)
}
});
console.log(result);