You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript:如何对比两个JSON数组,筛选指定条件的水果元素

数组筛选:提取符合条件的水果数据

需求说明

从fruits数组中筛选出满足以下任一条件的水果,仅保留其id和name字段到新数组:

  • 水果的id未出现在food数组中
  • 水果的id在food数组中存在,但对应的deleted值不等于"1"

原代码问题分析

你提供的代码存在几处关键错误:

  1. 逻辑运算符误用:条件中用了&&(且),但实际需要||(或)来满足两个条件的任一情况
  2. 索引错误匹配:直接用food[j]关联fruits[j]是错的,两个数组的索引并不一一对应,不能通过同一个循环索引绑定元素
  3. 无法获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 15:27:53