从JSON中删除重复的元素并将一列相加

时间:2017-12-26 18:40:31

标签: javascript arrays json

我有一个JSON数组



[
  {
    login: "LoginAAA",
    url: "someurl-aaa",
    number: 23
  },
  {
    login: "LoginBBB",
    url: "someurl-bbb",
    number: 56
  },
  {
    login: "LoginCCC",
    url: "someurl-ccc",
    number: 12
  },
  {
    login: "LoginAAA",
    url: "someurl-aaa",
    number: 46
  },
  {
    login: "LoginBBB",
    url: "someurl-bbb"
    number: 112
  },
  {
    login: "LoginCCC",
    url: "someurl-ccc",
    number: 24
  },
  {
    login: "LoginAAA",
    url: "someurl-aaa",
    number: 69
  },
  {
    login: "LoginBBB",
    url: "someurl-bbb",
    number: 168
  },
  {
    login: "LoginCCC",
    url: "someurl-ccc",
    number: 36
  }
]




我需要在数组中只保留具有唯一登录名的对象,但我必须总结"数字"每个"登录"并将总数分配给唯一的"登录"。 另外:我需要整个对象(带网址等)和总数。

我引用了How to make a JSON array uniqueArray unique values,但在这种情况下并非一切都清楚。

期望/结果



[
  {
    login: "LoginAAA",
    url: "someurl-aaa"
    number: 138
  },
  {
    login: "LoginBBB",
    url: "someurl-bbb"
    number: 336
  },
  {
    login: "LoginCCC",
    url: "someurl-ccc"
    number: 72
  }
]




4 个答案:

答案 0 :(得分:1)

只是一个基于es6的简单答案。

let result = [];
YOUR_JSON.forEach((item, index) => {
    const temp = result.filter(e=>{return e.login === item.login});
  if(temp.length > 0){
    result[result.findIndex(e=>{return e.login ===item.login})].number += item.number;
  }
  else{
    result.push(item);
  }
});

您将把结果输入结果数组。

[
  {
    login: "LoginAAA",
    url: "someurl-aaa"
    number: 138
  },
  {
    login: "LoginBBB",
    url: "someurl-bbb"
    number: 336
  },
  {
    login: "LoginCCC",
    url: "someurl-ccc"
    number: 72
  }
]

答案 1 :(得分:0)

您可以使用重复的键创建一个新的JSON对象。 例如:

var newJSON = {};
Object.keys(oldJSON).forEach(function(k) {
    newJSON[k] = newJSON[k] || {
        url: oldJSON[k].url,
        sum: 0
    };
    newJSON[k].sum += oldJSON[sum];
});
console.log(newJSON);

我希望这就是你要找的东西。

答案 2 :(得分:0)

试试这个;

var jsonObjectArray = JSON.parse(json);
var groupArray = [];
var totalNumber = 0;
jsonObjectArray.reduce(function (tmp, item) {
    if (!tmp[item.login]) {
        tmp[item.login] = {
            number: 0,
            login: item.login
        };
        groupArray.push(tmp[item.login])
    }
    totalNumber += item.number;
    tmp[item.login].number += item.number;
    return tmp;
}, {});
var result = { groupArray : groupArray, totalNumber : totalNumber }

<强>输出:

{
   "groupArray":[
      {
         "number":138,
         "login":"LoginAAA"
      },
      {
         "number":336,
         "login":"LoginBBB"
      },
      {
         "number":72,
         "login":"LoginCCC"
      }
   ],
   "totalNumber":546
}

此外,您在问题中分享的json无效。对于json属性,

需要每个字段的双引号和逗号
  {
    "login": "LoginAAA",
    "url": "someurl-aaa",
    "number": 23
  }

答案 3 :(得分:0)

假设var data是您定义数组的位置。使用Array.reduce函数你可以做这样的事情。

data.reduce((acc, val) => {
 if (acc[val.login] === undefined) {
   acc[val.login] = val;
 } else {
   acc[val.login].number = acc[val.login].number + val.number
 }
 return acc;
}, {});

您将从中得到以下结果。

{
  "LoginAAA": {
    "login": "LoginAAA",
    "url": "someurl-aaa",
    "number": 253
   },
   "LoginBBB": {
     "login": "LoginBBB",
      "url": "someurl-bbb",
      "number": 616
   },
   "LoginCCC": {
     "login": "LoginCCC",
     "url": "someurl-ccc",
     "number": 132
   }
}

为了进一步理解,您可以阅读有关Array.reduce方法https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce

的MDN文档