某个机能及其实现

描述

怎么说好呢……就是,先在数据库准备一系列默认的数据,类型最后是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了。

后记

完全没法小瞧这类东西,以后还是得多多学习。

再就是,需求这种东西,防止它改变可不容易呢,有余力的话自己考虑得更周全些吧。

InSb

InSb

只是跟工作和生活相关的记录