我试图返回一个新对象,其中包含现有对象中给出的属性以及给定数组中存在的键。我不能改变对象,如果键存在于数组中而不存在于对象中,则应忽略该键。我很想知道如何将数组元素与对象键进行比较。
function picker(array, obj) {
var newObj = {};
for (var i = 0; i < arrary.length; i++) {
if (array[i] !== obj[i]) {
newObj[array[i]] = obj[i];
}
}
return newObj;
}
var array = [
'a',
'c',
'e'
];
var obj = {
a: 1,
b: 2,
c: 3,
d: 4
};
var bubble = picker(array, obj);
console.log(bubble); result --> `{ a: 1, c: 3 }`
答案 0 :(得分:1)
你可能意味着这样的事情:
function picker(array, obj) {
var newObj = {};
for (var i = 0; i < array.length; i++) {
if (array[i] in obj) {
newObj[array[i]] = obj[array[i]];
}
}
return newObj;
}
var array = ['a', 'c', 'e'];
var obj = {a: 1, b: 2, c: 3, d: 4};
console.log(picker(array, obj));
也就是说,如果obj
包含名称为array[i]
的媒体资源,则将该媒体资源添加到newObj
。
如果您使用reduce
,forEach
或for...of
进行迭代,可能会更清楚,那么您就不会对索引i
感到困惑。
function picker(array, obj) {
return array.reduce(function(newObj, key) {
if (key in obj) newObj[key] = obj[key];
return newObj;
}, {});
}
var array = ['a', 'c', 'e'];
var obj = {a: 1, b: 2, c: 3, d: 4};
console.log(picker(array, obj));
答案 1 :(得分:1)
您可以执行类似
的操作const x = array.reduce((total, current) => current in obj ? ({
...total,
[current]: obj[current]
}) : total, {});
这基本上只创建一个对象,密钥后密钥,仅基于array
的项目,其中每个密钥的值取自obj
。查看the fiddle。
答案 2 :(得分:0)
您尚未检查该密钥是否存在于数组中。
条件if (array[i] !== obj[i]) {
正在尝试使用对象值而不是对象键来检查数组键。另外obj[i]
不正确,因为密钥obj[0]
不存在0
。
这是使用Object.keys
代替for
循环的另一种变体。
function picker(array, obj) {
var newObj = {};
Object.keys(obj).forEach(function(key){
if(array.indexOf(key) > -1) {
newObj[key] = obj[key];
}
});
return newObj;
}
var array = ['a', 'c', 'e'];
var obj = {a: 1, b: 2, c: 3, d: 4};
console.log(picker(array, obj));
&#13;