簡體   English   中英

將數組值與對象鍵進行比較

[英]Comparing Array Values With Object Keys

編寫一個名為“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”。 任何提示將不勝感激。

獲取對象的鍵與數組中的鍵的交集,有兩種方法:

  • 枚舉對象屬性鍵並檢查它們中的哪些也在數組中
  • 迭代數組中的鍵並檢查其中哪些也是對象屬性

您不必執行兩個循環。 第一種方法對小對象更有效,第二種方法也適用於大對象和小子集。

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循環,就像您成功地所做的那樣(我不會重復該解決方案),但兩者中哪一個更易於閱讀和理解,只有您可以決定。

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

您可以使用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 }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM