描述
怎么说好呢……就是,先在数据库准备一系列默认的数据,类型最后是List<>
这样,用户变更好了,数据再整体传回去,为用户建一系列新的记录。首次传上去的数据会把用户的ID放进去,这样以后修改的话根据用户ID就抽得出来了;但如果当时需要的数据和现在不同的话,再显示的话该怎么办呢?
解决方案
总之,一切以现在需要的数据为准就是。但之前的数据还是尽可能保留为好。
SQL
暂且不用具体的SQL文,简单讲讲思路:
默认数据的结果集 union all 根据用户ID抽出来的结果集,在此基础上用 row_number() over (partition by ... order by ...) 根据重复的字段内容根据顺序(null往后排哦)标号,最后只保留标号为1的就可以了。
JavaScript
思路跟上面SQL文的办法差不多,或许因此显得冗长吧。
const arr = [
{ item: 'm.docx', code: 'jikoshokai', seq: 3 },
{ item: 'c.pdf', code: 'shinsei_shorui', seq: 1 },
];
const empty = [
{ item: null, code: 'shomei_shorui', seq: 1 },
{ item: null, code: 'shinseisho', seq: 2 },
{ item: null, code: 'jikoshokai', seq: 3 },
];
const getTmpSeq = (() => {
let prev = undefined;
let c = 1;
return attr => {
if (attr === prev) {
c += 1;
} else {
c = 1;
}
prev = attr;
return c;
}
})();
const result = arr.concat(empty).sort((a, b) => {
if (a.seq === b.seq) {
if (a.code === b.code) {
return a.item - b.item;
} else {
return a.code - b.code;
}
} else {
return a.seq - b.seq;
}
}).map(obj => ({ ...obj, tmpSeq: getTmpSeq(obj.code) }))
.filter(obj => obj.tmpSeq === 1)
.map(obj => ({ item: obj.item, code: obj.code, seq: obj.seq }));
result
那么,结果是:
(4) […]
0: Object { item: "c.pdf", code: "shinsei_shorui", seq: 1 }
1: Object { item: null, code: "shomei_shorui", seq: 1 }
2: Object { item: null, code: "shinseisho", seq: 2 }
3: Object { item: "m.docx", code: "jikoshokai", seq: 3 }
length: 4
<prototype>: Array []
在Firefox上跑的哦。
这样好就好在扩展性还不错。如果过去追加上而现在没有的并不需要显示的话,比如code: "shinsei_shorui"
那行不想要了,再追加
.filter(obj => empty.map(obj2 => obj2.code).includes(obj.code))
就OK了。
后记
完全没法小瞧这类东西,以后还是得多多学习。
再就是,需求这种东西,防止它改变可不容易呢,有余力的话自己考虑得更周全些吧。