你好,我有一个看起来像这样的对象数组
UIStackView
我该如何迭代以返回新的let myArray = [
{item1: true},
{item2: false},
{item3: true},
{item4: false}
]
值数组,如下所示:
true
我找到了此函数,但它只返回单个项目:
let newArray = ['item1', 'item3']
谢谢!
答案 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
中的元素相同)。在map
和filter
中,我们使用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);
阵列上只有一个循环,而不是map
和filter
最终循环了两次。