让我们说,使用JSON.parse我在一个数组中获得了4个可能的答案(如多项选择测验)。该数组的每个值都有一个“特征”(我不知道怎么称呼它)。我想通过数组的每个值寻找特定的特征,并过滤掉那些不符合条件的值。
示例数组:
0: {correct: false}
1: {correct: true}
2: {correct: false}
3: {correct: false}
该数组的第一个值(1)是正确的答案,因为它的“特性”通过说它是“ true”来表示。我想让控制台打印出正确值的数字。
示例:正确答案是:1
感谢您的帮助
答案 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#map
和Array#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(', ')}`);