2

これが私が考えていることです:

オブジェクトの配列が与えられた場合:

[
    {
        "name": "Kirk",
        "count": 1
    },
    {
        "name": "Spock",
        "count": 1
    },
    {
        "name": "Kirk",
        "count": 1
    }
]

私は取得しようとしています:

[
    {
        "name": "Kirk",
        "count": 2
    },
    {
        "name": "Spock",
        "count": 1
    }
]

おそらくこれを達成するためにいくつかの高次関数を組み合わせたアルゴリズムが既にあるかどうか疑問に思っています。これはループで簡単に実行できますが、高階関数を使用して解決する方法を探しています。誰かがこれを達成するために何を使用すべきかを教えてくれたら、それは素晴らしいことです. 繰り返しますが、私はできるだけ洗練されたものを探しています(2 つのマップとフィルターは、ループからの大きな改善にはなりません)。

これが私の現在の解決策であり、より良いものを探しています(より良いとは、より表現力豊かであることを意味します):

function mergeDuplicates(input) {
  var output = [];
  var existingItem = null;
  input.forEach(function (inputItem) {
    existingItem = _.find(output, function (outputItem) {
      return inputItem.name === outputItem.name;
    });
    existingItem ? existingItem.count += 1 : output.push({
      name: inputItem.name,
      count: 1
    });
    existingItem = null;
  });
  return output;
}

行番号 10 をより明確にするために: 元の配列では、count存在しないか 1 である可能性があるため、1 に設定します。

4

6 に答える 6

0

これをもっと試してみてください。問題を解決するのに役立ちます

cleanup(arrayOfObj, 'name');

function cleanup(arr, prop) {
  var new_arr = [];
  var lookup = {};
  for (var i in arr) {
   lookup[arr[i][prop]] = arr[i];
  }
  for (i in lookup) {
   new_arr.push(lookup[i]); 
  }
  return new_arr;
}

于 2014-10-02T18:32:42.770 に答える
0

を使用したさらに別のバージョンreduce function:

var items =
[
    {
        "name": "Kirk",
        "count": 1
    },
    {
        "name": "Spock",
        "count": 1
    },
    {
        "name": "Kirk",
        "count": 1
    }
];
    

var filtered = items.reduce(function(prev, current,index){ 
    if(!(current.name in prev.keys)) {
       prev.keys[current.name] = index;
       prev.result.push(current);
   } 
   else{
       prev.result[prev.keys[current.name]].count += current.count; 
   }
   return prev;
},{result: [], keys: []}).result;

    

document.getElementById("output").innerHTML = JSON.stringify(filtered,null,2);
<pre id='output' />

于 2016-02-01T12:59:34.757 に答える