【问题标题】:Slice properties from objects and counting从对象切片属性和计数
【发布时间】:2016-08-19 13:29:39
【问题描述】:

是否可以从对象数组中分割单个属性,例如

[{"name":"Bryan","id":016, "counter":0}, {"name":"John","id":04, "counter":2}, {"name":"Alicia","id":07, "counter":6}, {"name":"Jenny","id":015, "counter":9}, {"name":"Bryan","id":016, "counter":0}, {"name":"Jenny","id":015, "counter":9}, {"name":"John","id":04, "counter":2}, {"name":"Jenny"    ,"id":015, "counter":9}];

我正在尝试从每个对象中切出name 并计算相同元素的数量(有 3 个名为 Jenny 的对象),以实现以下结构:

[{"name":"Bryan","Number":2},
{"name":"John","Number":2},
{"name":"Alicia","Number":1},
{"name":"Jenny","Number":3}]

【问题讨论】:

  • 嗨科里,是的,这是可能的。到目前为止,您尝试过什么?

标签: javascript arrays json object


【解决方案1】:

您要忽略已经存在的 idcounter 道具吗?

您可以创建一个对象来跟踪唯一名称,并在最后转换回数组:

var data = [{"name": "Bryan",  "id": 016,  "counter": 0}, {  "name": "John",  "id": 04,  "counter": 2}, {  "name": "Alicia",  "id": 07,  "counter": 6}, {  "name": "Jenny",  "id": 015,  "counter": 9}, {  "name": "Bryan",  "id": 016,  "counter ": 0}, {  "name": "Jenny",  "id": 015,  "counter ": 9}, {  "name": "John",  "id": 04,  "counter": 2}, {  "name": "Jenny",  "id": 015,  "counter": 9}];

var result = data.reduce(function(result, item) {
  if (!result[item.name]) {
    result[item.name] = {
      name: item.name,
      counter: 0
    };
  }

  result[item.name].counter += 1;
  
  return result;
}, {});

console.log(Object.keys(result).map(function(key) { return result[key] }));

【讨论】:

    【解决方案2】:

    您可以使用哈希表作为对计数名称的引用。

    var data = [{ name: "Bryan", id: "016", counter: 0 }, { name: "John", id: "04", counter: 2 }, { name: "Alicia", id: "07", counter: 6 }, { name: "Jenny", id: "015", counter: 9 }, { name: "Bryan", id: "016", counter: 0 }, { name: "Jenny", id: "015", counter: 9 }, { name: "John", id: "04", counter: 2 }, { name: "Jenny", id: "015", counter: 9 }],
        grouped = [];
    
    data.forEach(function (a) {
        if (!this[a.name]) {
            this[a.name] = { name: a.name, Number: 0 };
            grouped.push(this[a.name]);
        }
        this[a.name].Number++;
    }, Object.create(null));
    
    console.log(grouped);

    【讨论】:

      【解决方案3】:

      试一试。我们创建了一个名为nameDict 的名称字典,其中包含名称的计数,并遍历列表以对其进行计数。

      var arr = [{"name":"Bryan","id":"016", "counter":0}, {"name":"John","id":"04", "counter":2}, {"name":"Alicia","id":"07", "counter":6}, {"name":"Jenny","id":"015", "counter":9}, {"name":"Bryan","id":"016", "counter":0}, {"name":"Jenny","id":"015", "counter":9}, {"name":"John","id":"04", "counter":2}, {"name":"Jenny","id":"015", "counter":9}];
      var nameDict = {};
      
      for(var i = 0; i < arr.length; i++)
      {
          var name = arr[i].name;
          if(nameDict[name] == undefined){
              //haven't encountered this name before so we need to create a new entry in the dict
              nameDict[name] = 1
          } else {
              //otherwise increment the count
              nameDict[name] += 1
          }
      }
      
      console.log(JSON.stringify(nameDict));

      【讨论】:

        猜你喜欢
        • 2015-09-22
        • 1970-01-01
        • 2019-08-04
        • 1970-01-01
        • 2018-05-24
        • 1970-01-01
        • 1970-01-01
        • 2021-01-28
        • 1970-01-01
        相关资源
        最近更新 更多