js如何快速优雅地按不同条件拆分新上传的数组,并与预设数组比对映射,以便于补充缺漏的数值
时间: 2024-09-09 08:16:52 浏览: 62
在JavaScript中,你可以使用`Array.prototype.reduce()`、`Object.fromEntries()` 和 `Array.prototype.filter()` 等方法来根据不同的条件处理和映射数组。假设你有两个数组,一个是新上传的`newItems`,另一个是预设的`presetItems`,你需要找到两个数组中的差异并补充缺失的项。下面是一个示例:
```javascript
const newItems = [
{ id: 1, value: 'A' },
{ id: 3, value: 'C' },
{ id: 5, value: 'E' },
];
const presetItems = [
{ id: 1, value: 'A' },
{ id: 2, value: 'B' },
{ id: 3, value: 'C', additionalInfo: 'Info for C' },
];
function mergeAndFillMissing(newItems, presetItems) {
const merged = newItems.reduce((acc, item) => {
acc[item.id] = item; // 如果id存在,则添加item到结果
return acc;
}, {});
const diff = Object.entries(presetItems).filter(([id, _]) => !merged[id]); // 找出只存在于presetItems中的项
// 补充缺失的值
diff.forEach(([id, presetItem]) => {
if (!merged[id]) {
merged[id] = { ...presetItem };
} else {
// 如果新上传的值不存在,直接更新
if (merged[id].value !== presetItem.value) {
merged[id].value = presetItem.value;
}
// 如果有额外信息,也添加进来
if ('additionalInfo' in presetItem) {
merged[id].additionalInfo = presetItem.additionalInfo;
}
}
});
return Array.from(merged.values());
}
const result = mergeAndFillMissing(newItems, presetItems);
console.log(result); // 输出:[{ id: 1, value: 'A' }, { id: 2, value: 'B' }, { id: 3, value: 'C', additionalInfo: 'Info for C' }, { id: 5, value: 'E' }]
阅读全文