Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/411.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用JavaScript将数组数组与类似数组合并_Javascript_Arrays_Analytics - Fatal编程技术网

使用JavaScript将数组数组与类似数组合并

使用JavaScript将数组数组与类似数组合并,javascript,arrays,analytics,Javascript,Arrays,Analytics,我正在尝试合并来自两个不同提供者的两组分析数据。数组、国家名称和度量值的排列如下: [['Albania','1000'],['Australia','1000']] 两个数据集可以包含同一国家名称的不同版本(例如,英国而不是英国)。如何在Javascript中合并这些数组?通过合并,我的意思是将每个国家的数据集合并成一组数组 例如: [['Albania','1000'],['United Kingdom','1000']] + [['Albania','1000'],['UK','10

我正在尝试合并来自两个不同提供者的两组分析数据。数组、国家名称和度量值的排列如下:

[['Albania','1000'],['Australia','1000']]
两个数据集可以包含同一国家名称的不同版本(例如,英国而不是英国)。如何在Javascript中合并这些数组?通过合并,我的意思是将每个国家的数据集合并成一组数组

例如:

[['Albania','1000'],['United Kingdom','1000']]

+

[['Albania','1000'],['UK','1000']]

=

[['Albania','2000'],['United Kingdom','2000']]

澄清:我们的移动站点使用一个分析提供商,而我们的主要全球站点使用另一个不同的分析提供商。我们需要合并这些数据集以创建准确的报告。只有两个数据集需要合并。

一个解决方案是创建一个数组,将一个国家的所有可能名称映射到一个值

然后可以使用array_merge()解析这些值,并将它们放入结果数组中

例如:


您需要提供第三个数组来定义给定国家/地区的所有别名。可能是这样的:

// the preferred alias is the first element of each set
var countryAliases = [
    [ 'United Kingdom', 'UK' ],
    [ 'United States', 'US'],
    // ...
];

只需在每个数据数组中循环,在别名映射中找到每个项目的国家,然后将结果写入单个结果数组,使用首选别名作为键。

以下是从PHP帖子翻译过来的部分解决方案。这不会使您产生别名。由于关联数组的存在,PHP中的等效代码看起来更干净。如果使用对象文字而不是数组,则可以获得非常好的解决方案。此解决方案可能需要垫片,具体取决于您的平台

这将产生:
[['albana','2000'],['UK','1000'],['UK','1000']]
。您可以为此实现别名,但这很烦人-请参阅下文以获得更好的解决方案

这里是另一个解决方案,它不是作为结果生成数组数组,而是提供一个对象文本。在我看来,这要好得多。您可能无法控制从正在使用的任何API获得的数据,但您可以控制如何处理它,这应该会使下游代码更好。这可能需要一个垫片用于安装

这就产生了:
{'albana':2000,'unitedkingdom':2000}
。如果你真的必须有一个数组作为结果。。您可以这样做:

var arrSum = [];

for (var prop in sum) {
    if (sum.hasOwnProperty(prop)) {
        arrSum.push([prop, sum[prop]]);
    }        
}

“合并”的规则是什么?你怎么知道“UK”和“UK”应该组合在一起?似乎这不是满足你需求的最佳数据结构。我会创建一组用例,例如如果国家等于x,那么在你的示例中,结果不应该是:
[[['alpha','2000',['UK','2000']
另一个问题,是否只有两个数组,或者你要组合任意数量的数组?回答javascript调用。如果询问者的要求是php解决方案,我会+1。在这一点上,我不知道询问者的要求是什么。回答得很好,简洁明了。@HansZ你读过题目了吗?我错了。我整个上午都在浏览php,还以为自己还在那个部分。但是,否决票真的有必要吗?@Ryan您可以相当轻松地将此代码转换为javascript,但据我所知,没有array_merge()函数。只需在每个数组上运行foreach循环。你会得到同样的结果。不,只有两个不同的数据集,每个国家在其中只定义一次。工作很好,谢谢。
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]]);
    }
}
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;
}
var arrSum = [];

for (var prop in sum) {
    if (sum.hasOwnProperty(prop)) {
        arrSum.push([prop, sum[prop]]);
    }        
}