2016-11-21 97 views
1

我想返回一个新的对象,其中包含现有对象中给定的属性和给定数组中存在的键。我不能改变对象,并且如果键存在于数组中但不在对象中,则应该忽略该键。我挂断了如何比较数组元素和对象键。从现有的数组和对象创建新的对象

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

回答

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,forEachfor...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));

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

1

你可以做类似

const x = array.reduce((total, current) => current in obj ? ({ 
    ...total, 
    [current]: obj[current] 
}) : total, {}); 

这基本上创建了一个对象,键后键,仅基于array,在此采取每个键的值的项目从obj。退房the fiddle