Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/426.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用数组中的键筛选对象_Javascript - Fatal编程技术网

Javascript 使用数组中的键筛选对象

Javascript 使用数组中的键筛选对象,javascript,Javascript,我有这个数组 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 }; 我想知道如何用数组中的键

我有这个数组

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
。 一种方法是

obj.filter(elem => elem.id...);
但是这会遍历
obj
中的所有元素,即使
数组中只有三个元素。
最好是迭代
数组
,但是

array.filter(elem => elem === obj.id ...);
然后只返回
数组中的元素(意思是
1,3,6
)。 我需要的是一个数组

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

执行此操作的最佳方法是什么?

如果您将
id
作为键,则可以通过筛选键来映射所需的值,以仅获取已知键,然后映射值

const
数组=[1,3,6],
object={1:{id:1,foo:'bar'},2:{},3:{id:3,foo:'foo'},4:{},5:{},
结果=数组
.filter(对象.hasOwnProperty.bind(对象))
.map(id=>object[id].foo);

控制台日志(结果)
如果您将
id
作为键,则可以通过筛选键来映射所需的值,以便仅获取已知键,然后映射该值

const
数组=[1,3,6],
object={1:{id:1,foo:'bar'},2:{},3:{id:3,foo:'foo'},4:{},5:{},
结果=数组
.filter(对象.hasOwnProperty.bind(对象))
.map(id=>object[id].foo);

控制台日志(结果)您可以映射数组并从对象中返回键foo

const res = array.map(elem => obj[elem].foo);
如果对象中不存在所有元素,则可以添加过滤条件以删除未定义的值

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

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

const res = array.map(elem => obj[elem].foo);
如果对象中不存在所有元素,则可以添加过滤条件以删除未定义的值

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

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

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

如果
obj
中存在
array
中的所有值,则使用else如果
obj
中缺少条目,则可以使用

const数组=[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,[]);;

控制台日志(结果)
如果
数组中的所有值都存在于
obj
中,则使用else如果
obj
中缺少条目,则可以使用

const数组=[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,[]);;

控制台日志(结果)结果['foo',bar']
背后的逻辑是什么?数据是否将
id
作为键?@Nikhilagarwal这是什么意思?@NinaScholz是的
id
键,我的意思是这些值是什么
foo
bar
?此外,数组中是否有任何值在
obj
中不存在?
结果=['foo',bar']
背后的逻辑是什么?数据是否将
id
作为键?@NikhilAggarwal这是什么意思?@NinaScholz是的
id
键,我的意思是这些值是什么
foo
bar
?此外,数组中是否有任何值不存在于
obj
中?如果所有
array
元素实际存在于
obj
@georg中,则您是对的。如果所有
array
元素实际存在于
obj
@georg中,我更新了答案以处理未定义的情况,是的,您是对的。我更新了答案以处理未定义的情况