【问题标题】:how to group by the array values dynamically in javascript如何在javascript中动态地按数组值分组
【发布时间】:2017-06-06 12:34:22
【问题描述】:

大家好,我正在使用 javascript 我有一组数组,我需要按对象分组

代码

 var data = [{BuildingID: "5", FloorId: "65", one: 12, two: 15,three: 12},
            {BuildingID: "5", FloorId: "65", one: 12, two: 15,three: 12},
            {BuildingID: "6", FloorId: "65", one: 12, two: 15,three: 12},
            {BuildingID: "6", FloorId: "65", one: 12, two: 15,three: 12}]

我正在尝试按 BuildingID 添加一、二、三进行分组 注意:一二三不是静态的

异常输出

  var data = [{BuildingID: "5", FloorId: "65", one: 24, two: 30,three: 24},
              {BuildingID: "6", FloorId: "65", one: 24, two: 30,three: 24} ]

【问题讨论】:

  • 预期结果 json??
  • 一、二、三应该怎么办?
  • 预期结果json数组@JinsPeter
  • 一二三有时四五也来@Nina Scholz
  • @jose 你能显示考试结果吗?

标签: javascript arrays group-by


【解决方案1】:

您可以通过使用散列表和数组作为对象的静态键来使用动态方法。

var data = [{ BuildingID: "5", FloorId: "65", one: 12, two: 15, three: 12 }, { BuildingID: "5", FloorId: "65", one: 12, two: 15, three: 12 }, { BuildingID: "6", FloorId: "65", one: 12, two: 15, three: 12 }, { BuildingID: "6", FloorId: "65", one: 12, two: 15, three: 12 }],
    staticKeys = ['BuildingID', 'FloorId'] ,
    grouped = data.reduce(function (hash) {
        return function (r, a) {
            var key = a[staticKeys[0]];
            if (!hash[key]) {
                hash[key] = {};
                staticKeys.forEach(function (k) {
                    hash[key][k] = a[k];
                });
                r.push(hash[key]);
            }
            Object.keys(a).forEach(function (k) {
                if (staticKeys.indexOf(k) === -1) {
                    hash[key][k] = (hash[key][k] || 0) + a[k];
                }
            });
            return r;
        };
    }(Object.create(null)), []);

console.log(grouped);
.as-console-wrapper { max-height: 100% !important; top: 0; }

【讨论】:

  • 它包含静态值的键。作为哈希键,它使用索引为零的键的对象的值。
  • 这是否意味着,您需要同时使用两者作为分组键?
  • 现在它可以在组中添加另外两个字段了,我应该@Nina var key = a[staticKeys[0,1]];?
【解决方案2】:

这是一个适合我的 sn-p 代码,

假设你知道对象的关键属性

var arr = [ { id: 1, name: 'bob' }, { id: 1, name: 'bill' }, { id: 1, name: 'bill' } ]

var noDuplicate = [];
var unique = {};

$.each(arr, function(key, item) {

    if (! unique[item.id + "-" + item.name]) {
        noDuplicate.push(item);
        unique[item.id + "-" + item.name] = true;
    }
});

console.log(noDuplicate);

希望对你有所帮助;)

问候。

【讨论】:

  • 尝试制作小提琴@fxlacroix
【解决方案3】:

你可以试试这个sn-p,“输出”变量包含结果;

var data = [{ BuildingID: "5", FloorId: "65", one: 12, two: 15, three: 12 }, { BuildingID: "5", FloorId: "65", one: 12, two: 15, three: 12 }, { BuildingID: "6", FloorId: "65", one: 12, two: 15, three: 12 }, { BuildingID: "6", FloorId: "65", one: 12, two: 15, three: 12 }]
var groupBy = function(input, key) {
   return input.reduce(function(list, x) {
     list[x[key]] = x;
     return list;
   }, {});
};
var grouped = groupBy(data, 'BuildingID'), output=[];
for ( var key in grouped ) { output[output.length] = grouped[key]; }
console.log(output);

【讨论】:

    猜你喜欢
    • 2016-01-06
    • 1970-01-01
    • 2016-08-18
    • 1970-01-01
    • 2018-09-02
    • 2017-03-14
    • 2021-10-26
    • 2021-12-03
    • 2012-10-04
    相关资源
    最近更新 更多