我在过滤JSON文件中的数组时遇到问题。
当我在主数组中使用filter
时,它可以工作,但是我不能在子数组中做到这一点。
这是JSON文件:
[
{
"id": 1354,
"name": "name",
"type": "simple",
"status": "ok",
"categories": [
{
"id": 79,
"name": "A",
},
{
"id": 68,
"name": "B",
}
]
},
{
"id": 1368,
"name": "name",
"type": "simple",
"status": "ok",
"categories": [
{
"id": 79,
"name": "A",
},
{
"id": 72,
"name": "C",
}
]
},
{...}
]
我正在使用此代码进行过滤,它可以按预期工作并返回带有status: 'ok'
的项目:
return items.filter( item => {
return item.status == 'ok';
});
我要存档的是退还具有category.name: 'B'
的物品。
此代码似乎仅适用于第一个类别,并且如果该项目的第一个类别不是'B',则该项目不会显示:
return items.filter( item => {
for (let category of item.categories) {
return category.name == 'B';
}
});
感谢任何想法
答案 0 :(得分:1)
尝试改用Array.prototype.some()
-仅当某些数组元素满足传递条件时,它才会返回true
。
const whole = [
{
"id": 1354,
"name": "name",
"type": "simple",
"status": "ok",
"categories": [
{
"id": 79,
"name": "A",
},
{
"id": 68,
"name": "B",
}
]
},
{
"id": 1368,
"name": "name",
"type": "simple",
"status": "ok",
"categories": [
{
"id": 79,
"name": "A",
},
{
"id": 72,
"name": "C",
}
]
},
{
"id": 1364,
"name": "name",
"type": "simple",
"status": "ok",
"categories": [
{
"id": 71,
"name": "B",
},
{
"id": 70,
"name": "C",
}
]
},
]
const filtered = whole.filter(level_1 => {
return level_1.categories.some(level_2 => level_2['name'] === 'B')
})
console.log(filtered);
答案 1 :(得分:0)
您在for
循环中返回时间过早。您正在寻找的是some
:
const res = arr.filter(e => e.categories.some(({name}) => name === 'B'));
console.log(res);
<script>
const arr = [
{
"id": 1354,
"name": "name",
"type": "simple",
"status": "ok",
"categories": [
{
"id": 79,
"name": "A",
},
{
"id": 68,
"name": "B",
}
]
},
{
"id": 1368,
"name": "name",
"type": "simple",
"status": "ok",
"categories": [
{
"id": 79,
"name": "A",
},
{
"id": 72,
"name": "C",
}
]
},
]
</script>
答案 2 :(得分:0)
您可以执行以下操作:
return items.filter( item => {
return item.categories.findIndex(category => category.name === 'B') > -1
});
答案 3 :(得分:0)
您已经在第一次类别检查后返回。如果类别名称与所需的模式不匹配,则应继续迭代,并且仅在所有迭代之后返回false。
return items.filter(item => {
for (let category of item.categories) {
if (category.name === 'B') {
return true;
}
}
return false;
});
答案 4 :(得分:-1)
仅在找到类别后才想返回
return items.filter( item => {
for (let category of item.categories) {
if (category.name === 'B') {
return true
}
}
});
或使用Array.prototype.some的其他解决方案
return items.filter(item => {
return item.categories.some(category => category.name === 'B');
});