【问题标题】:Comparing Array Values With Object Keys将数组值与对象键进行比较
【发布时间】:2018-02-06 21:47:14
【问题描述】:

编写一个名为“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 来搜索对象,但我从不使用 for (var k in obj) 中的“k”。任何提示将不胜感激。

【问题讨论】:

  • 是的,只需省略for (var k in obj) {。它在您的代码中绝对没有任何用途。你能解释一下你的意思吗?
  • 我想搜索对象@Bergi的每个属性
  • @jhazelton1 你不需要遍历obj,因为你正在使用arr.reduce 来做到这一点。
  • 并且您将在第一次迭代中返回,因此无论哪种方式都不会查找对象的所有属性

标签: javascript arrays object for-in-loop


【解决方案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 相反,有一个太多 :-) 谢谢,修复!
【解决方案2】:

您可以使用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.
【解决方案3】:

使用 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 }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多