【问题标题】:JSON minor data removerJSON 次要数据删除器
【发布时间】:2021-06-29 20:30:04
【问题描述】:

我有一个 JSON,有两个同名的人,但开始日期不同,我想只留下较大的一个

        {
            "startDate": "2020-11-01",
            "name":"Gustavo Fran"
        },
        {
            "startDate": "2020-10-01",
            "name":"Gustavo Fran"
        },
        {
            "startDate": "2020-10-01",
            "name":"Henry Fran"
        }

【问题讨论】:

  • 日期如何变大?你的意思是过去更长的时间?
  • @BenediktKromer——我认为“更大”意味着更晚,所以“2020-11-01”大于“2020-10-01”。

标签: javascript node.js date


【解决方案1】:

您可以使用 reduce 来迭代数组并创建一个新的唯一项数组。如果有重复的名字,只保留最近的。

鉴于日期采用 ISO 8601 格式,它们可以作为字符串进行比较,而无需解析为 Date 对象。下面实现了上面的,如果找到更新的副本,就替换累加器中的当前副本。

let data = [
  {
    "startDate": "2020-11-01",
    "name": "Gustavo Fran"
  },
  {
    "startDate": "2020-10-01",
    "name": "Gustavo Fran"
  }, {
    "startDate": "2020-10-01",
    "name": "Henry Fran"
  }
];
  
let list = data.reduce((acc, obj) => {
  // Look for a duplicate
  let idx = acc.findIndex(el => el.name == obj.name);
  // If there isn't one, add it to the accumulator
  // Otherwise, replace the current one with obj if it's newer
  idx == -1? acc.push(obj) :
         obj.startDate > acc[idx].startDate? acc.splice(idx, 1, obj) : null;
  return acc;
}, []);

console.log(list);

我认为上述方法很有效,因为它不会将时间戳解析为日期,也不会创建额外的(和冗余的)映射或数组。如果它还根据名称为累加器中的项目保留索引会更有效,因此可以只查找项目以获取其索引,而不是使用 findIndex

【讨论】:

    【解决方案2】:

    const data = [{ "startDate": "2020-11-01", "name":"Gustavo Fran" }, { "startDate": "2020-10-01", "name":"Gustavo Fran" }, { "startDate": "2020-10-01", "name":"Henry Fran" }];
    
    const res = [...
      // iterate over the list
      data.reduce((map, item) => {
        const { name, startDate } = item;
        // get previous map value with name if exists
        const prev = map.get(name);
        // if not found, or this one has a greater startDate, update the map
        if(!prev || Date.parse(startDate) > Date.parse(prev.startDate))
          map.set(name, item);
        return map;
      }, new Map)
      // return name items with greatest start dates
      .values()
    ];
    
    console.log(res);

    【讨论】:

      【解决方案3】:

      你可以像这样使用Array.prototype.reduce()

      const input = [
        {
          startDate: "2020-11-01",
          name: "Gustavo Fran",
        },
        {
          startDate: "2020-10-01",
          name: "Gustavo Fran",
        },
        {
          startDate: "2020-10-01",
          name: "Henry Fran",
        },
      ];
      
      const result = input.reduce((acc, cur) => {
        const found = acc.find((x) => x.name === cur.name);
        if (found && new Date(found.startDate) < new Date(cur.startDate)) {
          found.startDate = cur.startDate;
          return acc;
        } else {
          return [...acc, cur];
        }
      }, []);
      
      console.log(result);

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-05-06
        • 1970-01-01
        • 1970-01-01
        • 2016-09-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-31
        相关资源
        最近更新 更多