这是我参与更文挑战的第1天,活动详情查看: 更文挑战
最近做的项目里有一个编辑列表页后保存的需求,因为保存的数据量比较大,所以保存的时候只给后端传已修改的数据。由于页面比较复杂,无法通过watch监听(关键是比较菜),所有我就用for循环来实现这个功能。
首先数据格式是下面这样的:
const savedData = [
{
"pinci":"1天1次",
"name":"zxhtest",
"id":5524,
"zhuangtai":"2"
},
{
"pinci":"1天1次",
"name":"zxhtest",
"id":5530,
"zhuangtai":"1"
},
{
"pinci":"1天1次",
"name":"zxhtest",
"id":5536,
"zhuangtai":""
},
{
"pinci":"1月1次",
"name":"zxhtest",
"id":5542,
"zhuangtai":"1"
},
{
"pinci":"1天1次",
"name":"zxhtest",
"id":5545,
"zhuangtai":"1"
},
];
const newAddData = [
{
"pinci":"1年1次",
"name":"行动项测试",
"id":5507,
"zhuangtai":"1",
"delete": true,
},
{
"pinci":"1天1次",
"name":"zxhtest",
"id":5517,
"zhuangtai":"2"
},
{
"pinci":"1月1次",
"name":"zxh测试计划模板",
"id":5562,
"zhuangtai":"1"
},
{
"pinci":"1季度1次",
"name":"zxh测试计划模板",
"id":5568,
"zhuangtai":""
}]
复制代码
变量说明:
savedData:已保存的数据;
newAddData:新增数据;
参数说明:
name: 是唯一的;
id: 已保存过的数据会有唯一的id,新增数据没有;
delete: 删除本条数据;
pinci和zhuangtai: 这两个字段有可能重复;
除了id不可更改,其他的参数(name, pinci, zhuangtai)都是可更改的
遍历newAddData,首先判断对象中有没有id,如果没有则表示新增数据,塞到result中;然后判断name、pinci、zhuangtai只要有一个不相等,即表示修改了数据,塞到result中;最后判断delete如果等于true,表示已删除数据,还是塞到result中。这样就把更改的数据提取出来了。
const result = [];
for (let i = 0; i < newAddData.length; i++) {
const current = newAddData[i];
const equalObj = savedData.find(item => item.id === current.id);
if (!equalObj) {
result.push(current);
} else if (current.name !== equalObj.name || current.pinci !== equalObj.pinci || ++current.zhuangtai !== ++equalObj.zhuangtai) {
result.push(current);
}
if (current.smZHDelete) {
result.push(current)
}
}
复制代码
PS: 其实这个问题困扰我很久了,我尝试过很多方法,比如用双重循环,用fileter,还百度了很久,都不能很好的实现,最后是问了大佬,不到2分钟就出来了。看了代码后,我:嗯?就这?好吧,我果然还是菜啊(╥╯^╰╥)
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END