从现有数组和对象创建新对象

时间:2016-11-21 23:04:27

标签: javascript

我试图返回一个新对象,其中包含现有对象中给出的属性以及给定数组中存在的键。我不能改变对象,如果键存在于数组中而不存在于对象中,则应忽略该键。我很想知道如何将数组元素与对象键进行比较。

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

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

如果您使用reduceforEachfor...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循环的另一种变体。

&#13;
&#13;
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;
&#13;
&#13;