比较数组值和对象键

3

编写一个名为“select”的函数。

给定一个数组和一个对象,“select”返回一个新对象,其属性是给定对象中的属性,并且其键存在于给定数组中。

var arr = ['a', 'c', 'e'];
var obj = {
  a: 1,
  b: 2,
  c: 3,
  d: 4
};
var output = select(arr, obj);
console.log(output); // --> { a: 1, c: 3 }

我的解决方案:

function select(arr, obj) {
  for (var k in obj) {
    return arr.reduce((o, c) => {
      if (obj.hasOwnProperty(c)) {
        o[c] = obj[c]
      }
      return o
    }, {})
  }
}

var array = ['a', 'c', 'e'];

var object = {
  a: 1,
  b: 2,
  c: 3,
  d: 4
};

console.log(select(array, object));

我的解决方案可以工作,但我感觉我没有使用最佳实践或最优雅的代码。例如,我使用for/in来搜索对象,但我从来没有使用过'k'(即for(var k in obj)中的'k')。任何建议都将不胜感激。


3
是的,只需省略 for (var k in obj) {。它在你的代码中完全没有作用。你能解释一下你想让它做什么吗? - Bergi
我想要搜索@Bergi对象的每个属性。 - jhazelton1
2
@jhazelton1,你不需要遍历obj,因为你正在使用arr.reduce来完成这个任务。 - evolutionxbox
而且你在第一次迭代时就返回了,所以无论如何都不会查找对象的所有属性。 - baao
3个回答

1
你可以使用 Object.assign()reduce(),并在内部检查对象中是否存在属性。

var arr = ['a', 'c', 'e'];
var obj = { a: 1,b: 2,c: 3, d: 4};

let select = (arr, obj) => arr.reduce((r, e) => Object.assign(r, obj[e] ? {[e]: obj[e]} : null), {})

var output = select(arr, obj);
console.log(output); // --> { a: 1, c: 3 }


不要将字符串传递给 Object.assign。传递 null - Bergi

1
获取对象键和数组键之间的交集,有两种方法:
  • 枚举对象属性键并检查哪些也在数组中
  • 迭代数组键并检查哪些也是对象属性
你不必执行两个循环。 第一种方法对于小对象更有效,第二种方法对于大对象和小子集同样有效。
function select(arr, obj) {
  let o = {};
  for (let k in obj)
    if (arr.includes(k))
      o[k] = obj[k];
  return o;
}

function select(arr, obj) {
  let o = {};
  for (let k of arr)
    if (k in obj)
      o[k] = obj[k];
  return o;
}

你也可以使用 reduce 代替 for … of 循环,就像你成功地做了一样(我不会重复那个解决方案),但哪种方法更易于阅读和理解只有你自己能决定。

我认为你缺少了一个花括号。 - LaravelSucks
@LaravelSucks 相反,拥有一个太多了 :-) 谢谢,已修正! - Bergi
这只匹配第一个键,然后返回。 - London804
@London804 不是这样的吗?return语句在相应的循环之后。 - Bergi
@Bergi 对不起,你是对的。看起来我的 console.log 在循环中。一旦允许我,我会点赞的。 - London804

0
使用Array#reduce迭代数组,并将所有存在于对象上的属性提取到新对象中:

const arr = ['a', 'c', 'e'];
const obj = {
  a: 1,
  b: 2,
  c: 3,
  d: 4
};

const select = (arr, obj) => arr.reduce((r, prop) => {
    obj.hasOwnProperty(prop) && (r[prop] = obj[prop]);
    
    return r;
  }, {});

const output = select(arr, obj);
console.log(output); // --> { a: 1, c: 3 }


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接