首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用相似的键对数据进行分组?

如何用相似的键对数据进行分组?
EN

Stack Overflow用户
提问于 2016-05-19 13:57:58
回答 4查看 66关注 0票数 1

我有CSV的数据:

代码语言:javascript
复制
Group   Profession  Status          Count
6       Fisherman   Offer Accepted  1
6       Fisherman   All             1
7       Fisherman   Offer Accepted  1
7       Fisherman   All             1
8       Banker      Onboard         2
8       Banker      All             2
8       Cook        Onboard         4
8       Cook        All             4
8       Developer   Onboard         2
8       Developer   All             2
9       Banker      Onboard         2
9       Banker      Offer Accepted  1
9       Banker      All             3

它需要作为JSON数组返回:

代码语言:javascript
复制
"Fisherman" : {
    6 : {
        "Offer Accepted" : 1,
        "All" : 1
    },
    7 : {
        "Offer Accepted" : 1,
        "All" : 1
    }
},
"Banker" : {
    8 : {
        "Onboard" : 2,
        "All" : 2
    },
    9 : {
        "Onboard" : 2,
        "Offer Accepted" : 1,
        "All" : 3
    }
},
....so on

到目前为止,我所做的是我得到了所有独特的专业和集团。

然后我环顾了所有的数据,并比较了是否有匹配的专业和集团。

代码语言:javascript
复制
for(var d in data) {
    var json = [];
    for(var p in profession) {
        for(var g in group) {
            if(data[d]["Profession"] == profession[p] && data[d]["Group"] == group[g]) {
                json.push({data[d]["Status"] : data[d]["Count"]});
                // put 'json' variable in JSON array with key group? 
            }
        }
    }
}

如果有匹配,则创建一个数组,在其中推送状态和计数。

但我真的不知道怎么从那里开始。

谢谢你的帮助!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-05-19 14:19:19

假设数据是一个数组,其对象如下,

代码语言:javascript
复制
{ Group: 6, Profession: 'Fisherman', Status: 'Offer Accepted', Count: 1 }

然后,您可以使用以下内容

代码语言:javascript
复制
var order = ['Profession', 'Group', 'Status'],
    object = {};

data.forEach(function (d) {
    order.reduce(function (r, a) {
        r[d[a]] = r[d[a]] || {};
        return r[d[a]];
    }, object).Count = d.Count;
});

它的工作原理: d是一个具有上述结构的对象。oder是一个数组,其键按结果object的所需顺序排列。(我将json重命名为object,因为JSON是一个具有特殊格式的字符串,而不是像这里所需的对象)。 对于计数的赋值,必须知道属性的路径。这是通过在order上迭代实际对象d的键来授予的。

代码语言:javascript
复制
r[d[a]] = r[d[a]] || {};

d[a]用于检查该属性是否存在,如果没有分配空对象。

在回调结束时,返回对最后一个对象r[d[a]]的引用。

最后,用Count的值对一个新的属性d.Count进行了评估。

对象一个da返回值/ 在数据的第一个循环之后的 {“渔夫”:{ "6":{“接受报价”:{“计数”:1}

综述:reduce返回一些高度可控的内容。

票数 2
EN

Stack Overflow用户

发布于 2016-05-19 14:08:50

试试这个:

代码语言:javascript
复制
var result = new Array();
for(var d in data){
    if(result[d.profession] == 'undefined'){
        result[d.profession] = new Array();
    }
    if(result[d.profession][d.group] == 'undefined'){
        result[d.profession][d.group] = new Array();
    }
    result[d.profession][d.group][d.status] = d.count;
}

result = JSON.stringify(result);//convert array to json
console.log(result);

我没有测试它,我假设您的JSON数据在数据变量中

票数 0
EN

Stack Overflow用户

发布于 2016-05-19 14:21:03

您可以很容易地减少以下操作:

代码语言:javascript
复制
const result = data.reduce((result, row) => {
    ensureKeyExists(result, row.Profession);
  ensureKeyExists(result[row.Profession], row.Group);

  result[row.Profession][row.Group][row.Status] = row.Count;

  return result;
}, {});

function ensureKeyExists(object, key, defaultVal = {}) {
    if (!object[key]) {
    object[key] = defaultVal;
  }
}

完整示例:https://jsfiddle.net/k1zk3ses/

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37325497

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档