请问大家,如果我有两个这样的数组,我怎么进行判断,这样的逻辑是否正确?
var arr1 = [
{field: 'order_date', title: '单据日期'}
,{field: 'order_sn', title: '单据编号'}
,{field: 'date', title: '时间'}
,{field: 'username', title: '客户名称'}
,{field: 'goods_sn', title: '商品编码'}
var arr2 = [
{field: 'order_date', title: '单据日期'}
,{field: 'order_sn', title: '单据编号'}
,{field: 'goods_unit', title: '单位'}
,{field: 'goods_number', title: '数量'}
,{field: 'date', title: '时间'}
,{field: 'username', title: '客户名称'}
,{field: 'goods_sn', title: '商品编码'}
]
如果arr2中有的数据,arr1 没有,就把arr2中有的数据按索引值和数据 插入到arr1中
如果arr1中没有的数据,arr2中有,就把arr2中有的数据按索引值位置删除
请问这个判断是不是有些自相矛盾?但是我现在业务确实有个这样的需求,不知道如何考虑和实现
回答:
来点简单粗暴的:
function find(field, list) { // 假设根据 field 这个字段判断是否为一样
// 可以根据实际情况调整判断一样的条件
return list.find(item => item.field === field)
}
const willConcat = []
arr2 = arr2.filter(item => {
// 在 arr1 里找一下
const exists = find(item.field, arr1)
// 如果 arr1 里没有,则是需要合并到 arr1 里的
if (!exists) {
willConcat.push(item)
}
// arr1 里没有就过滤掉,即 (!exists) 为 true 时返回 false
return !!exists
})
arr1 = arr1.concat(willConcat)
回答:
arr1 和 arr2 是两个数据,根据这两个数据的当前状态来对他们进行改变完全没毛病!关键就在于“当前状态”四个字。
从两个需求来看,如果按第一个需求把 arr2 中存在但 arr1 中不存在的数据插入 arr1 之后,就不可能满足第 2 个需求的条件。所以这两个需求只能是针对“当前状态”,也就是改变前的状态。但程序得一步步进行,改变了 arr1,arr1 的状态就变化了,所以在改变 arr1 之前需要把它的状态保存下来。这样就可以在改变 arr1 之后根据保存的 arr1 的原来的状态来修改 arr2。
不过仔细分析,会发现两个需求其实针对的都是 arr2 中有但 arr1 中没有的数据。所以就不用这么麻烦去保存 arr1 的状态了,直接把我们的目标数据找出来就行。
- 从 arr2 中找到不存在于 arr1 中的数据,保存到临时数据 temp 中。两个需要都要用到序号,而实际上保存了序号就能取到值,所以只保存序号就可以。
- 遍历 temp,在 arr1 中按序号插入对应的数据
- 反向遍历 temp,从 arr2 中删除对应的数据(为什么要反向遍历,想想看)
在写代码之前,说点逻辑无关的 —— 建议不要把逗号放在句首,就算是为了便于调整位置,JS 从语法层面上也允许最后一项后面接逗号来适应懒人们的需求 —— 哦不,是源代码版本管理的需求。
var arr1 = [ { field: "order_date", title: "单据日期" },
{ field: "order_sn", title: "单据编号" },
{ field: "date", title: "时间" },
{ field: "username", title: "客户名称" },
{ field: "goods_sn", title: "商品编码" }, // <-- 看,这里可以加逗号哦!
];
var arr2 = [
{ field: "order_date", title: "单据日期" },
{ field: "order_sn", title: "单据编号" },
{ field: "goods_unit", title: "单位" },
{ field: "goods_number", title: "数量" },
{ field: "date", title: "时间" },
{ field: "username", title: "客户名称" },
{ field: "goods_sn", title: "商品编码" },
];
// 看数据猜判断依据是 field 属性
// 从 arr1 拿出所有 field 生成一个集合,方便后面判断是否存在
const fields = new Set(arr1.map(item => item.field));
// 找到 arr2 中存在但 arr1 中不存在的数据,按每个元素是 [index, item] 的形式保存为列表
const additionals = arr2
.map((it, i) => [i, it])
.filter(([, { field }]) => !fields.has(field));
// 为了在一个正循环里完成对两个数组的修改,用 removed 记录删除偏移量
// 如果逆序遍历来处理 arr2 就不需要这个偏移量
let removed = 0;
additionals.forEach(([i, it]) => {
arr1.splice(i, 0, it);
arr2.splice(i - removed, 1);
removed++;
});
console.log(arr1);
console.log(arr2);
以上是 请问大家,如果我有两个这样的数组,我怎么进行判断,这样的逻辑是否正确? 的全部内容, 来源链接: utcz.com/p/937486.html