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中,我更新了答案以处理未定义的情况,是的,您是对的。我更新了答案以处理未定义的情况