如何对比对象相等值?筛选food数组中未包含的水果信息
解决数组对象对比筛选问题
原代码存在的问题
- 对比逻辑错误:错误地将
food[d](整个对象)与fruits[j].id做对比,实际需要匹配的是水果的name和food数组的food_name字段。 - 循环逻辑混乱:只要单次对比不相等就往结果数组推数据,导致同一个水果被重复添加多次。
- 对象引用复用:始终使用同一个
res对象,最终数组里的所有元素都会指向最后一次修改的对象。
正确实现方案(高效版)
先把food数组中的所有food_name提取到Set中(查找效率O(1)),再过滤出fruits中未在food里出现的水果:
const fruits = [{id: '1', name: 'Apple'}, {id: '2', name: 'Orange'}, {id: '3', name: 'Cherry'}]; const food=[{id: '1', creation_date: '2023-05-13 09:46:25', created_by: '1'}, {id: '1', food_name: 'Orange'}, {id: '2', food_name: 'Bread'}, {id: '3', food_name: 'Chees'}, {id: '4', food_name: 'Milk'}, {id: '5', food_name: 'Salt'} ]; // 提取所有有效的food_name并存入Set const foodNames = new Set(food.map(item => item.food_name).filter(Boolean)); // 筛选并提取目标数据 const dep_data = fruits .filter(fruit => !foodNames.has(fruit.name)) .map(fruit => ({ id: fruit.id, name: fruit.name })); console.log(dep_data); // 输出:[{id: '1', name: 'Apple'}, {id: '3', name: 'Cherry'}]
基于for循环的实现(贴近原代码写法)
如果习惯用for循环,可按以下方式改进:
const fruits = [{id: '1', name: 'Apple'}, {id: '2', name: 'Orange'}, {id: '3', name: 'Cherry'}]; const food=[{id: '1', creation_date: '2023-05-13 09:46:25', created_by: '1'}, {id: '1', food_name: 'Orange'}, {id: '2', food_name: 'Bread'}, {id: '3', food_name: 'Chees'}, {id: '4', food_name: 'Milk'}, {id: '5', food_name: 'Salt'} ]; const dep_data = []; const foodNames = []; // 先收集所有有效的food_name for (let d = 0; d < food.length; d++) { if (food[d].food_name) { foodNames.push(food[d].food_name); } } // 遍历水果,筛选未在food中出现的项 for (let j = 0; j < fruits.length; j++) { const currentFruit = fruits[j]; let isNotInFood = true; for (let name of foodNames) { if (currentFruit.name === name) { isNotInFood = false; break; } } if (isNotInFood) { // 每次创建新对象,避免引用复用问题 dep_data.push({ id: currentFruit.id, name: currentFruit.name }); } } console.log(dep_data);
内容的提问来源于stack exchange,提问作者alice
相关产品推荐
相关产品推荐

