【问题标题】:How to groupby using lodash by ignoring minor difference如何通过忽略细微差异使用 lodash 进行分组
【发布时间】:2017-04-21 10:51:07
【问题描述】:

我有以下形式的数据。我正在逐行使用 loadash 进行 groupby 。然而 loadash groupby 正在返回基于行值的组,我希望它应该忽略行和组之间 1 值的微小差异。前任。它应该在一组中添加第 9 行和第 10 行的项目。我应该从 groupby 回调函数返回什么,它将通过包含相邻值对属性进行分组。

[
  {
    "row": 9,
    "city": "Camas"
  },
  {
    "row": 9,
    "city": "Kersey"
  },
  {
    "row": 6,
    "city": "Ebro"
  },
  {
    "row": 10,
    "city": "Orick"
  },
  {
    "row": 2,
    "city": "Bonanza"
  },
  {
    "row": 6,
    "city": "Rowe"
  },
  {
    "row": 5,
    "city": "Walland"
  }
]

预期输出

 {
    2: [
        {
            "row": 2,
            "city": "Bonanza"
        },
    ],
    5: [
        {
            "row": 6,
            "city": "Ebro"
        },
        {
            "row": 6,
            "city": "Rowe"
        },
        {
            "row": 5,
            "city": "Walland"
        }
    ],
    9: [{
        "row": 9,
        "city": "Camas"
    },
    {
        "row": 9,
        "city": "Kersey"
    },
    {
        "row": 10,
        "city": "Orick"
    }
    ]
}

【问题讨论】:

  • lodash#groupBy 返回一个对象,其中键表示您提供的集合的键或您从提供的迭代对象生成的自定义键的唯一值。根据您的说明,我没有看到将它们按特定标准(键)分组的方法,您能提供预期的输出吗?
  • @ryeballar,我更新了问题,还添加了预期的输出。返回对象中的键并不重要,任何东西都可以接受。
  • 如果我们添加一行:7 和一行:8 会发生什么?
  • @ryeballar,不会有这种情况,最多有2分误差(差异)。

标签: lodash


【解决方案1】:

解决这个问题的一种方法是sortrow 的集合以升序排列,然后reduce 排序的集合通过组合行差为 1 的项目并简单地分配那些没有的一个。

var result = _(data)
  .sortBy('row')
  .reduce(function(group, item) {
    var nIndex = item.row - 1;
    var value = [item];
    if (group[nIndex]) {
      group[nIndex] = value.concat(group[nIndex]);
    } else {
      group[item.row] = value;
    }
    return group;
  }, {});

var data = [{
    "row": 9,
    "city": "Camas"
  },
  {
    "row": 9,
    "city": "Kersey"
  },
  {
    "row": 6,
    "city": "Ebro"
  },
  {
    "row": 10,
    "city": "Orick"
  },
  {
    "row": 2,
    "city": "Bonanza"
  },
  {
    "row": 6,
    "city": "Rowe"
  },
  {
    "row": 5,
    "city": "Walland"
  }
];

var result = _(data)
  .sortBy('row')
  .reduce(function(group, item) {
    var nIndex = item.row - 1;
    var value = [item];
    if (group[nIndex]) {
      group[nIndex] = value.concat(group[nIndex]);
    } else {
      group[item.row] = value;
    }
    return group;
  }, {});

console.log(result);
body>div {
  min-height: 100%;
  top: 0;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.js"></script>

上面的解决方案也可以使用vanilla JS Array#sortArray#reduce来实现

var result = data
  .sort(function(v1, v2) {
    return v1.row - v2.row;
  })
  .reduce(function(group, item) {
    var nIndex = item.row - 1;
    var value = [item];
    if (group[nIndex]) {
      group[nIndex] = value.concat(group[nIndex]);
    } else {
      group[item.row] = value;
    }
    return group;
  }, {});

var data = [{
    "row": 9,
    "city": "Camas"
  },
  {
    "row": 9,
    "city": "Kersey"
  },
  {
    "row": 6,
    "city": "Ebro"
  },
  {
    "row": 10,
    "city": "Orick"
  },
  {
    "row": 2,
    "city": "Bonanza"
  },
  {
    "row": 6,
    "city": "Rowe"
  },
  {
    "row": 5,
    "city": "Walland"
  }
];

var result = data
  .sort(function(v1, v2) {
    return v1.row - v2.row;
  })
  .reduce(function(group, item) {
    var nIndex = item.row - 1;
    var value = [item];
    if (group[nIndex]) {
      group[nIndex] = value.concat(group[nIndex]);
    } else {
      group[item.row] = value;
    }
    return group;
  }, {});

console.log(result);
body>div {
  min-height: 100%;
  top: 0;
}

【讨论】:

    猜你喜欢
    • 2020-10-13
    • 1970-01-01
    • 2011-02-05
    • 2016-12-27
    • 2015-09-12
    • 2022-01-12
    • 2012-01-28
    • 2019-08-31
    • 1970-01-01
    相关资源
    最近更新 更多