Javascript 基于另一个数组中的值获取键数组
假设我有一个如下所示的对象数组Javascript 基于另一个数组中的值获取键数组,javascript,Javascript,假设我有一个如下所示的对象数组 let myArray = [ {item1: true}, {item2: false}, {item3: true}, {item4: false} ] 我如何迭代此操作以返回一个新的true值数组,如下所示: let newArray = ['item1', 'item3'] const arr = [ { item1: true }, { item2: false }, { item3: true }, { item4:
let myArray = [
{item1: true},
{item2: false},
{item3: true},
{item4: false}
]
我如何迭代此操作以返回一个新的true
值数组,如下所示:
let newArray = ['item1', 'item3']
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);
我找到了此函数,但它只返回单个项:
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;
}
您可以通过
Object.keys()
访问每个数组项的第一个键,并使用该键筛选具有该第一个键的真值的项,然后通过调用map()
将该项转换为基于相同“第一个键”技术的值来完成此过程:
让myArray=[
{item1:true},
{item2:false},
{item3:true},
{item4:false}
]
让结果=myArray
.filter(项=>项[Object.keys(项)[0]]==true)
.map(项=>Object.keys(项)[0])
console.log(result)
使用函数reduce
生成所需的输出。函数reduce
的处理程序将获取键
,并检查每个值===true
这种方法检查对象中的整套关键点。此外,这种方法只使用一个循环
让myArray=[{item1:true},{item2:false},{item3:true},{item4:false}],
result=myArray.reduce((a,c)=>a.concat(Object.keys(c.filter)(k=>c[k]==true)),[]);
控制台日志(结果)代码>最短
在上面的解决方案中,我们首先使用:作为循环来获取密钥数组(使用)[“item1”、“item2”、“item3”、“item4”]
。然后,我们通过只选择原始数组对象具有true
的键来创建该数组。e、 gmyArray[0][“item1”]->true
(我们使用一个事实,即filter函数采用数组元素(k)及其索引(i),这与myArray
中的元素相同)。在我们使用的map
和filter
中。假设myArray
始终包含只有1个属性的对象
let newArray = myArray
.map(item => Object.entries(item)[0])
.filter(([key, value]) => value)
.map(([key, value]) => key)
比公认答案优化得多的东西如下所示:
let newArray = ['item1', 'item3']
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);
const arr=[
{item1:true},
{item2:false},
{item3:true},
{item4:false}
]
常量结果=[];
常数长度=阵列长度;
for(设i=0;i
数组上只有一个循环,而不是最后循环两次的map
和filter
。等等,这只会起作用吗id键的格式是item+i?这些只是占位符keys@cup_of不客气!如果有帮助的话,请考虑接受这个答案:-这个词的CoppI将通过选择每一个项目的第一个键来工作,这是否符合你的要求?谢谢你,伙计。我会接受它的,当它允许的时候me@cup_of没有问题:-)虽然这可能回答了作者的问题,但它缺少一些解释性的词语和/或指向文档的链接。如果没有一些短语,原始代码片段就没有多大帮助。你也会发现这很有帮助。请编辑您的答案。@RoyScheffers这是使用标准js函数(ES6)的非常短的代码,但是我可以解释它-我更新了我的答案。我知道这是一个简短的示例,对于那些熟悉.map()
.filter()
和arrow函数的人来说,它们将能够阅读并理解它,但是,并不是每个人都处于这一级别。通过您提供的澄清,您增加了有助于该语言新手的价值。