根据每个值的内容过滤出JSON数组

TBG*_*TBG 3 javascript arrays json object

可以说,使用JSON.parse我在一个数组中获得了4个可能的答案(如多项选择测验)。该数组的每个值都有一个“特征”(我不知道怎么称呼它)。我想通过数组的每个值寻找一个特定的特征,并过滤掉那些不符合条件的值。

数组示例:

0: {correct: false}
1: {correct: true}
2: {correct: false}
3: {correct: false}
Run Code Online (Sandbox Code Playgroud)

数组的第一个值(1)是正确的答案,因为它的“特性”通过说它是“ true”来表示。我想使控制台打印出正确值的数字。

示例:正确的答案是:1

谢谢你的帮助

Mah*_*Ali 5

您可以使用findIndex()which返回匹配条件的数组第一个元素的索引。

const arr = [
   {correct: false},
   {correct: true},
   {correct: false},
   {correct: false},
]

console.log(`the correct answer is` + arr.findIndex(x => x.correct))
Run Code Online (Sandbox Code Playgroud)


Kév*_*let 4

正如Maheer Ali 所说,你可以使用Array#findIndex,但它会返回一个值 - 第一个满足条件的值。在您的示例中,如果您有许多correct键等于的对象true,您仍然会得到其中之一。

所以,如果你想让所有的对象都满足要求,有很多解决方案。


Array#reduce

正如Maheer Ali在评论中建议的那样,您可以尝试使用Array#reduce.

更短,并且在数组上有一个独特的循环:

const arr = [
     {correct: false},
     {correct: true},
     {correct: false},
     {correct: true},
  ],
  filtered = arr.reduce((acc, item, index) => ((item.correct) ? [...acc, index] : acc), []);

console.log(`the correct answers are ${filtered.join(', ')}`);
Run Code Online (Sandbox Code Playgroud)


Array#mapArray#filter

尝试Array#map(用于Array#filter删除false值):

const arr = [
     {correct: false},
     {correct: true},
     {correct: false},
     {correct: true},
  ],
  filtered = arr.map((item, index) => ((item.correct) ? index : false)).filter((item) => (item));

console.log(`the correct answers are ${filtered.join(', ')}`);
Run Code Online (Sandbox Code Playgroud)

但是,该数组将循环两次(一次由Array#map,另一次由Array#filter.


for...in陈述

最终,您可以通过使用循环迭代原始数组来将索引推入空数组中来完成此操作for...in

const arr = [
     {correct: false},
     {correct: true},
     {correct: false},
     {correct: true},
  ],
  filtered = [];
  
for (let index in arr) {
  if (arr[index].correct) {
    filtered.push(index);
  }
}

console.log(`the correct answers are ${filtered.join(', ')}`);
Run Code Online (Sandbox Code Playgroud)