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、 g
myArray[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函数的人来说,它们将能够阅读并理解它,但是,并不是每个人都处于这一级别。通过您提供的澄清,您增加了有助于该语言新手的价值。