[英]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
元素相同的事實)。 在map
和filter
我們使用箭頭函數。
比接受的答案更優化的東西看起來像這樣:
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);
數組上只有一個循環,而不是最終循環兩次的map
和filter
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.