我正在尝试合并来自两个不同提供商的两组分析数据。数组,国家/地区名称以及指标的排列方式如下:
[['Albania','1000'],['Australia','1000']]
两个数据集都可以包含相同国家/地区名称的不同版本(例如英国而不是英国)。如何在Javascript中合并这些数组?通过合并,我的意思是将每个国家/地区的数据集合并到一组数组中。
示例:
[['Albania','1000'],['United Kingdom','1000']]
+
[['Albania','1000'],['UK','1000']]
=
[['Albania','2000'],['United Kingdom','2000']]
澄清:我们的移动网站使用一个分析提供商,因为我们的主要全球网站使用另一个不同的分析提供商。我们需要合并这些数据集以创建准确的报告。只需要合并2个数据集。
答案 0 :(得分:0)
一种解决方案是创建一个数组,将一个国家/地区的所有可能名称映射到一个值。
然后你可以使用array_merge()并解析这些值,将它们放在结果数组中。
E.G:
<?php
$countryMap = array(
'United Kingdom' => 'uk',
'UK' => 'uk',
'Albania' => 'alb'
);
$array1 = array(array('Albania', 1000), array('United Kingdom', 1000));
$array2 = array(array('Albania', 1000), array('UK', 1000));
$mergedArray = array_merge($array1, $array2);
$finalArray = array();
foreach ($mergedArray as $a) {
if (isset($finalArray[$countryMap[$a[0]]]))
$finalArray[$countryMap[$a[0]]] += $a[1];
else
$finalArray[$countryMap[$a[0]]] = $a[1];
}
var_dump($finalArray);
答案 1 :(得分:0)
您需要提供第三个数组来定义给定国家/地区的所有别名。也许是这样的:
// the preferred alias is the first element of each set
var countryAliases = [
[ 'United Kingdom', 'UK' ],
[ 'United States', 'US'],
// ...
];
只需循环遍历每个数据数组,在别名映射中查找每个项目的国家/地区,然后使用首选别名作为键将结果写入单个结果数组。
答案 2 :(得分:0)
这是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]]);
}
}