根据另一个数组中的值获取键数组| JS

时间:2018-11-08 22:57:33

标签: javascript

你好,我有一个看起来像这样的对象数组

UIStackView

我该如何迭代以返回新的let myArray = [ {item1: true}, {item2: false}, {item3: true}, {item4: false} ] 值数组,如下所示:

true

我找到了此函数,但它只返回单个项目:

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

谢谢!

5 个答案:

答案 0 :(得分:2)

假设myArray始终包含仅具有1个属性的对象。

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

答案 1 :(得分:1)

您可以通过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)

答案 2 :(得分:1)

使用函数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);

答案 3 :(得分:1)

最短

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

在上述解决方案中,我们首先使用:map,它作为for循环来获取键数组(使用Object.keys["item1", "item2", "item3", "item4"]。然后,我们filter通过仅选择原始数组对象具有true的那些键来对该数组进行选择。例如myArray[0]["item1"] -> true(我们使用过滤器功能采用数组元素(k)及其索引(i)的事实,该元素与myArray中的元素相同)。在mapfilter中,我们使用arrow functions

答案 4 :(得分:1)

比接受的答案优化得多的东西看起来像这样:

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最终循环了两次。