これは、PHPの投稿から翻訳された部分的な解決策です。これではエイリアシングは発生しません。PHPの同等のコードは、連想配列があるため、かなりきれいに見えます。配列の代わりにオブジェクトリテラルを使用すると、非常に優れたソリューションを得ることができます。このソリューションでは、プラットフォームに応じてシムが必要になる場合がありArray.indexOf
ます。Array.concat
http://jsfiddle.net/radu/8JQBS/
var arr1 = [['Albania','1000'],['United Kingdom','1000']],
arr2 = [['Albania','1000'],['UK','1000']],
sum = [],
index = -1;
var mergedArray = arr1.concat(arr2);
for (var i = 0, n = mergedArray.length; i !== n; i++) {
for (var j = 0, m = sum.length; j !== m; j++) {
if (sum[j].indexOf(mergedArray[i][0]) !== -1) {
index = j;
break;
} else {
index = -1;
}
}
if (index !== -1) {
sum[index][1] = (
parseInt(sum[index][1], 10) +
parseInt(mergedArray[i][1], 10)
).toString();
} else {
sum.push([mergedArray[i][0], mergedArray[i][1]]);
}
}
これにより、次のようになり[['Albania', '2000'], ['United Kingdom', '1000'], ['UK', '1000']]
ます。このためにエイリアシングを実装することもできますが、面倒です。より良い解決策については、以下を参照してください。
結果として配列の配列を生成する代わりに、オブジェクトリテラルを与える別のソリューションがあります。私の意見では、これははるかに優れています。使用しているAPIから取得するデータを制御できない場合がありますが、データの処理方法を制御できます。これにより、ダウンストリームコードが改善されます。これには、のシムが必要になる場合がありますObject.hasOwnProperty
。
http://jsfiddle.net/radu/fPsdc/
var arr1 = [['Albania','1000'],['United Kingdom','1000']],
arr2 = [['Albania','1000'],['UK','1000']],
mergedArray = arr1.concat(arr2),
sum = {},
// property is preferred name
// define aliases in lowercase
aliases = {
'uk' : 'United Kingdom'
};
for (var i = 0, n = mergedArray.length; i !== n; i++) {
var country = mergedArray[i][0],
num = parseInt(mergedArray[i][1], 10);
if (aliases.hasOwnProperty(country.toLowerCase())) {
country = aliases[country.toLowerCase()];
}
if (sum.hasOwnProperty(country))
sum[country] += num;
else
sum[country] = num;
}
これにより、次のようになり{'Albania' : 2000, 'United Kingdom' : 2000}
ます。結果として本当に配列の配列が必要な場合は、次のように実行できます。
var arrSum = [];
for (var prop in sum) {
if (sum.hasOwnProperty(prop)) {
arrSum.push([prop, sum[prop]]);
}
}