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

时间:2019-04-19 07:37:55

标签: javascript arrays json object

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

示例数组:

0: {correct: false}
1: {correct: true}
2: {correct: false}
3: {correct: false}

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

示例:正确答案是:1

感谢您的帮助

2 个答案:

答案 0 :(得分:5)

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

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

console.log(`the correct answer is` + arr.findIndex(x => x.correct))

答案 1 :(得分:4)

Maheer Ali said一样,您可以使用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(', ')}`);


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(', ')}`);

但是,该数组将循环两次(一次由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(', ')}`);