JavaScript:如何对比两个JSON数组,筛选指定条件的水果元素
数组筛选:提取符合条件的水果数据
需求说明
从fruits数组中筛选出满足以下任一条件的水果,仅保留其id和name字段到新数组:
- 水果的
id未出现在food数组中 - 水果的
id在food数组中存在,但对应的deleted值不等于"1"
原代码问题分析
你提供的代码存在几处关键错误:
- 逻辑运算符误用:条件中用了
&&(且),但实际需要||(或)来满足两个条件的任一情况 - 索引错误匹配:直接用
food[j]关联fruits[j]是错的,两个数组的索引并不一一对应,不能通过同一个循环索引绑定元素 - 无法获取deleted状态:仅用Set存储
food的id,没法拿到对应项的deleted值做判断
修正后的代码
const fruits = [ { id: '1', name: 'Apple' }, { id: '2', name: 'Orange' }, { id: '3', name: 'Cherry' } ]; const food = [ { id: '1', food_name: 'Bread', deleted: "0" }, { id: '2', food_name: 'Orange', deleted: "0" }, { id: '3', food_name: 'Cheese', deleted: "0" }, { id: '4', food_name: 'Apple', deleted: "1" }, { id: '5', food_name: 'Salt', deleted: "0" } ]; // 建立id到food项的映射,实现快速查找 const foodIdMap = new Map(food.map(item => [item.id, item])); // 筛选目标水果并提取需要的字段 const dep_data = fruits .filter(fruit => { const matchedFood = foodIdMap.get(fruit.id); // 满足条件:无匹配项,或匹配项的deleted不等于"1" return !matchedFood || matchedFood.deleted !== "1"; }) .map(fruit => ({ id: fruit.id, name: fruit.name })); console.log(dep_data); // 输出:[{ id: '1', name: 'Apple' }, { id: '2', name: 'Orange' }, { id: '3', name: 'Cherry' }]
匹配示例预期的调整说明
如果你的预期结果是仅包含Apple和Cherry,说明实际需求可能是排除在food中存在且deleted为"0"的项,只需修改filter条件为:
return !matchedFood || matchedFood.deleted === "1";
修改后输出就会和你给出的示例预期一致:[{ id: '1', name: 'Apple' }, { id: '3', name: 'Cherry' }]
内容的提问来源于stack exchange,提问作者alice
相关产品推荐
相关产品推荐

