【问题标题】:Removing duplicate dates in two arrays using lodash/fp使用 lodash/fp 删除两个数组中的重复日期
【发布时间】:2018-05-07 20:48:52
【问题描述】:

我正在尝试采用更实用的方法来显示数据,但在从数组中删除重复项时遇到了麻烦。我想要实现的是删除和/或合并相同日期的项目。

我尝试使用_.uniqBy,但它只返回未触及的列表,因为它是一个日期对象,因此。

new Date(2018, 4, 7) === new Date(2018, 4, 7) //false new Date(2018, 4, 7) == new Date(2018, 4, 7) //false

有没有一种方法可以使用uniqBy 或其他在函数方法中合并或删除重复项的方法进行深度匹配。

注意:对象/函数已被简化为问题。

const items = [{date: new Date(2018, 4, 7), wellbeing: 50}];
const days = [{date: new Date(2018, 4, 7)}, {date: new Date(2018, 4, 8)}];
const Row = (item) => item; // not real map just mock

function mapToRow(data) {
   return _.pipe([
    sortByDate,
    _.uniqBy('date'),
    _.map(Row)
  ])(data)
}
function sortByDate(array) {
  return array.sort((a, b) => {
    a = new Date(a.date);
    b = new Date(b.date);
    return a < b ? -1 : a > b ? 1 : 0;
  });
}

console.log(mapToRow(days.concat(items)));
&lt;script src="https://cdn.jsdelivr.net/g/lodash@4(lodash.min.js+lodash.fp.min.js"&gt;&lt;/script&gt;

可以使用moment等lib

//预期结果

[{date: new Date(2018, 4, 7), wellbeing: 50}, {date: new Date(2018, 4, 8)}]

【问题讨论】:

    标签: javascript ecmascript-6 lodash


    【解决方案1】:

    您可以使用_.unionWith(),并使用_.isEqual()检查是否相等:

    const items = [{date: new Date(2018, 4, 7), wellbeing: 50}];
    const days = [{date: new Date(2018, 4, 7)}, {date: new Date(2018, 4, 8)}];
    
    const result = _.unionWith(
      (arrVal, othVal) => _.isEqual(arrVal.date, othVal.date),
      items,
      days
    );
    
    console.log(result);
    &lt;script src="https://cdn.jsdelivr.net/g/lodash@4(lodash.min.js+lodash.fp.min.js"&gt;&lt;/script&gt;

    仅使用 ES6,您可以将两个数组 reduceMap,然后将 spread Map.values() 返回到数组:

    const items = [{date: new Date(2018, 4, 7), wellbeing: 50}];
    const days = [{date: new Date(2018, 4, 7)}, {date: new Date(2018, 4, 8)}];
    
    const result = [...items.concat(days)
      .reduce((r, o) => {
        const time = o.date.getTime();
        return r.set(time, { ...r.get(time), ...o });
      }, new Map())
      .values()];
      
    console.log(result);

    【讨论】:

      【解决方案2】:

      您可以按日期分组,然后使用地图与Object.assign进行合并:

      const items = [{date: new Date(2018, 4, 7), wellbeing: 50}];
      const days = [{date: new Date(2018, 4, 7)}, {date: new Date(2018, 4, 8)}];
      const Row = (item) => item; // not real map just mock
      
      function mapToRow(data) {
         return _.pipe([
          sortByDate,
          _.groupBy('date'),
          _.map(xs => Object.assign({}, ...xs)),
          _.map(Row)
        ])(data)
      }
      function sortByDate(array) {
        return array.sort((a, b) => {
          a = new Date(a.date);
          b = new Date(b.date);
          return a < b ? -1 : a > b ? 1 : 0;
        });
      }
      
      console.log(mapToRow(days.concat(items)));
      &lt;script src="https://cdn.jsdelivr.net/g/lodash@4(lodash.min.js+lodash.fp.min.js"&gt;&lt;/script&gt;

      【讨论】:

        猜你喜欢
        • 2018-05-15
        • 1970-01-01
        • 2015-10-22
        • 2017-10-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-28
        相关资源
        最近更新 更多