簡體   English   中英

根據另一個數組中的值獲取鍵數組

[英]Get array of keys based on values from another array

假設我有一個看起來像這樣的對象數組

let myArray = [
  {item1: true},
  {item2: false},
  {item3: true},
  {item4: false}
]

我將如何迭代這個以返回一個新的true值數組,如下所示:

let newArray = ['item1', 'item3']

我找到了這個函數,但它只返回單個項目:

function findKey(map, term) {
  var found = [];
  for(var property in map) {
    if(map.hasOwnProperty(property)) {
      for(var key in map[property]) {
        if(map[property].hasOwnProperty(key) && key === term) {
          found.push(property);
        }
      }
    }
  }
  return found;
}

假設myArray始終包含只有 1 個屬性的對象。

let newArray = myArray
    .map(item => Object.entries(item)[0])
    .filter(([key, value]) => value)
    .map(([key, value]) => key)

您可以通過Object.keys()訪問每個數組項的第一個鍵,並使用它來過濾具有該第一個鍵的真值的項,然后通過調用map()將項轉換為值基於相同的“第一鍵”技術:

 let myArray = [ {item1: true}, {item2: false}, {item3: true}, {item4: false} ] let result = myArray .filter(item => item[ Object.keys(item)[0] ] === true) .map(item => Object.keys(item)[0]) console.log(result)

使用函數reduce來構建所需的輸出。 函數reduce的處理程序將獲取keys並檢查每個value === true

這種方法檢查對象內的整個鍵集。 此外,這種方式您只使用一個循環。

 let myArray = [{item1: true},{item2: false},{item3: true},{item4: false}], result = myArray.reduce((a, c) => a.concat(Object.keys(c).filter(k => c[k] === true)), []); console.log(result);

最短的

let newArray = myArray.map( x=>Object.keys(x)[0] ).filter( (k,i)=>myArray[i][k] ); 

在上面的解決方案中,我們首先使用: map作為 for 循環來獲取鍵數組(使用Object.keys["item1", "item2", "item3", "item4"] 然后我們通過僅選擇原始數組對象具有true那些鍵來過濾該數組。 例如myArray[0]["item1"] -> true (我們使用過濾函數采用數組元素 (k) 及其索引 (i) 這與myArray元素相同的事實)。 mapfilter我們使用箭頭函數

比接受的答案更優化的東西看起來像這樣:

const arr = [
  { item1: true },
  { item2: false },
  { item3: true },
  { item4: false }
]

const result = [];
const len = arr.length;

for (let i = 0; i < len; ++i) {
  const obj = arr[i];
  const key = Object.keys(obj)[0];

  if(obj[key]) {
    result.push(key);
  }
}

console.log(result);

數組上只有一個循環,而不是最終循環兩次的mapfilter

暫無
暫無

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

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