在json数组中添加重复的字符串值

时间:2015-06-07 10:56:57

标签: javascript json

我有JSON为

var newJSON = [{
    "key": "India",
    "value": "72"
}, {
    "key": "India",
    "value": "27"
}, {
    "key": "Pakistan",
    "value": "90"
}, {
    "key": "Zimbamwe",
    "value": "88"
}, {
    "key": "India",
    "value": "100"
}, {
    "key": "Pakistan",
    "value": "172"
}]

我想要如下所示的结果,其中重复的key值将value属性添加到一起:

[{
    "key": "India",
    "value": "199"
}, {
    "key": "Pakistan",
    "value": "262"
}, {
    "key": "Zimbamwe",
    "value": "88"
}]

请帮我解决这个问题

3 个答案:

答案 0 :(得分:0)

以下是解决方案:

var grouped = [];
var added = [];

for(var i = 0; i < json.length; i++) {
    var indexOfCountry = added.indexOf(json[i].key);
    if (indexOfCountry >= 0)
    {
        grouped[indexOfCountry].value = (Number(grouped[indexOfCountry].value) + Number(json[i].value)).toString();
    }
    else {
        grouped.push(json[i]);
        added.push(json[i].key);
    }
}

grouped数组是您想要的结果。

小提琴:https://jsfiddle.net/zummw9zp/

答案 1 :(得分:0)

这是return newJSON.reduce(function(result, entry) { key = entry.key; result[key] = result[key] || { key: key, value: 0 }; result[key].value += entry.value; return result; }, {}); 的经典用例,它设计用于获取数组,并以某种方式将其“减少”到其他事物,通过循环遍历它们并在每次迭代时转换结果。

_.mapObject(_.groupBy(newJSON, 'key'), total)

使用下划线

如果您可以使用像Underscore这样的库,可以将其写为

`A(B, C)`

使用我们描述的叙事风格

B

as

  

使用A

C`A(B(C))` C

B

作为

  

选择AnewJSON。然后获取结果并key到它

我们几乎可以把它读成英文:

  

使用 total _.groupBy 将其分组 { India: [ {key: "India", value: 72}, {key: "India", value: 100... ], ... } 。然后使用 total

获取结果并映射对象

function total(group) { return sum(group . map(value)); } 生成一个由某个属性键入的对象并返回组,这些组是属于每个组的所有条目的数组:

[ {key: "India", value: 72}, {key: "India", value: 100}, ... ],

_.mapObject计算每个组的总价值:

sum

所以它转换了一个条目数组

function sum(array)   { return array.reduce(add); }
function add(a, b)    { return a+b; }

到199.我们使用它来使用value将条目数组映射到总分数。

此处value可以写为

function value(entry) { return entry.value; }

function add (a, b) { return a+b; } function sum (array) { return array.reduce(add); } function value (entry) { return entry.value; } function total (group) { return sum(group . map(value)); } _.mapObject(_.groupBy(newJSON, 'key'), total) 是一个小实用程序函数,用于检索<style name="Base.AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> 属性:

setElevation(4 / context.getResources().getDisplayMetrics().density);

所以完整的解决方案是:

{{1}}

答案 2 :(得分:0)

reduce

的另一种变体
var result = newJSON.reduce(function(acc, el){
  var val = acc.map[el.key];
  if(!val){
    acc.map[el.key] = val = { key:el.key, value: parseInt(el.value) };
    acc.result.push(val);
  }else{
    val.value += parseInt(el.value);
  }
  return acc;
},{map:{}, result:[]}).result;

&#13;
&#13;
var newJSON = [
    {"key":"India","value":"72"},{"key":"India","value":"27"},
    {"key":"Pakistan","value":"90"},{"key":"Zimbamwe","value":"88"},
    {"key":"India","value":"100"},{"key":"Pakistan","value":"172"}
];

document.getElementById('r').innerHTML = 'newJSON: ' + JSON.stringify(newJSON);

var result = newJSON.reduce(function(acc, el){
  var val = acc.map[el.key];
  if(!val){
    acc.map[el.key] = val = { key:el.key, value: parseInt(el.value) };
    acc.result.push(val);
  }else{
    val.value += parseInt(el.value);
  }
  return acc;
},{map:{}, result:[]}).result;

document.getElementById('r').innerHTML += '<br /><br />result: ' + JSON.stringify(result);
&#13;
<div id="r"></div>
&#13;
&#13;
&#13;