【问题标题】:Sort unique array by id and keeping last value按 id 对唯一数组进行排序并保留最后一个值
【发布时间】:2021-04-14 18:32:24
【问题描述】:

我有关注

let arr = [
  { id: 1, referenceId: 1, type: "normal", name: "a" },
  { id: 2, referenceId: 1, type: "normal", name: "b" },
  { id: 3, referenceId: 3, type: "chat", name: "c" },
  { id: 4, referenceId: 4, type: "normal", name: "d" },
  { id: 5, referenceId: 5, type: "chat", name: "e" },
  { id: 6, referenceId: 3, type: "chat", name: "f" }
];

我想要如下输出:

[
  { id: 1, referenceId: 1, type: "normal", name: "a" },
  { id: 2, referenceId: 1, type: "normal", name: "b" },
  { id: 4, referenceId: 4, type: "normal", name: "d" },
  { id: 5, referenceId: 5, type: "chat", name: "e" },
  { id: 6, referenceId: 3, type: "chat", name: "f" }
];

我想排序 if type === "chat", 试试这样(type === "normal", no sort) :

arr.filter(item => {
  if (item.type === "normal") {
    return item
  }
  //sort array by referenceId and keeping last item

})

【问题讨论】:

  • 欢迎来到 SO!我对filter 回调中的逻辑有点困惑。 item.type === "normal" 与您的规范的其余部分有什么关系?
  • 只排序 type === "chat", if type === "normal" 不排序

标签: javascript arrays typescript sorting


【解决方案1】:

您可以对referenceId -> lastIndex 进行映射,然后在filter 中查找索引以仅保留与referenceId 的最后一个匹配的索引。进行检查以确保我们仅过滤掉 type: "chat" 项目。时间复杂度是线性的。

const arr = [
  { id: 1, referenceId: 1, type: "normal", name: "a" },
  { id: 2, referenceId: 1, type: "normal", name: "b" },
  { id: 3, referenceId: 3, type: "chat", name: "c" },
  { id: 4, referenceId: 4, type: "normal", name: "d" },
  { id: 5, referenceId: 5, type: "chat", name: "e" },
  { id: 6, referenceId: 3, type: "chat", name: "f" }
];

const lastIdxes = arr.reduce((a, e, i) => {
  a[e.referenceId] = i;
  return a;
}, {});
const result = arr.filter((e, i) => 
  e.type !== "chat" || i === lastIdxes[e.referenceId]
);
console.log(result);

【讨论】:

    【解决方案2】:

    你可以像这样使用reduce,

    let arr = [
      { id: 1, referenceId: 1, type: "normal", name: "a" },
      { id: 2, referenceId: 2, type: "normal", name: "b" },
      { id: 3, referenceId: 3, type: "chat", name: "c" },
      { id: 4, referenceId: 4, type: "normal", name: "d" },
      { id: 5, referenceId: 5, type: "chat", name: "e" },
      { id: 6, referenceId: 3, type: "chat", name: "f" }
    ];
    
    res = arr.reduce((prev, curr) => {
      index = prev.findIndex(item => item.referenceId === curr.referenceId);
      if(index > -1) {
        prev.splice(index, 1);
      }
      
      prev.push(curr);
      return prev;
    }, []);
    console.log(res);

    【讨论】:

      【解决方案3】:

      按照此问题的标题按 id 排序,然后跟踪何时删除重复项

      // sort by id and drop referenceId duplicates
      const arr = [
        { id: 1, referenceId: 1, type: "normal", name: "a" },
        { id: 2, referenceId: 2, type: "normal", name: "b" },
        { id: 3, referenceId: 3, type: "chat", name: "c" },
        { id: 4, referenceId: 4, type: "normal", name: "d" },
        { id: 5, referenceId: 5, type: "chat", name: "e" },
        { id: 6, referenceId: 3, type: "chat", name: "f" }
      ];
      
      arr.sort((a, b) => a.id > b.id ? 1 : -1);
      
      const toDrop = [];
      const mapper = {};
      arr.forEach((curr, i) => {
          if (mapper[curr.referenceId] !== undefined) {
          toDrop.unshift(mapper[curr.referenceId]);
        }
        mapper[curr.referenceId] = i;
      });
      
      toDrop.forEach(i => {
          arr.splice(i, 1);
      });
      
      console.log(arr);

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-05-18
        • 1970-01-01
        • 2013-03-23
        • 1970-01-01
        • 2019-01-02
        • 1970-01-01
        • 1970-01-01
        • 2018-02-12
        相关资源
        最近更新 更多