繁体   English   中英

用数组中的键过滤对象

[英]Filter object with keys in array

我有这个数组

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

我想知道如何用array的键过滤obj 一种方法是

obj.filter(elem => elem.id...);

但这会遍历obj中的所有元素,尽管array中只有三个元素。 更好的方法是遍历array ,但是

array.filter(elem => elem === obj.id ...);

然后仅返回array的元素(即1, 3, 6 )。 我需要的是一个看起来像的数组

const result  = ['s', 'b', 'c', 'd'];

做这个的最好方式是什么?

您可以映射数组并从对象内部返回键foo

const res = array.map(elem => obj[elem].foo);

如果对象中不存在所有元素,则可以添加过滤条件以删除未定义的值

const res = array.map(elem => obj[elem] &&obj[elem].foo).filter(Boolean);

如果您将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); 

如果objarray所有值都存在,则使用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); 

您不需要迭代所有只需要检查键是否存在的对象,如果键存在,则将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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM