请问大家,如果我有两个这样的数组,我怎么进行判断,这样的逻辑是否正确?

请问大家,如果我有两个这样的数组,我怎么进行判断,这样的逻辑是否正确?

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 的状态了,直接把我们的目标数据找出来就行。

  1. 从 arr2 中找到不存在于 arr1 中的数据,保存到临时数据 temp 中。两个需要都要用到序号,而实际上保存了序号就能取到值,所以只保存序号就可以。
  2. 遍历 temp,在 arr1 中按序号插入对应的数据
  3. 反向遍历 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

回到顶部