对与另一个数组对应的数组求和

时间:2015-11-22 18:34:09

标签: javascript arrays

我试图在javascript中解决以下问题,尝试了不同的实现方法但到目前为止还没有真正的成功。我有2个相同长度的数组,例如:

var years=[2010,2011,2009,2008,2010,2011,2007,2008,2008]
var money=[2,3,6,5,13,8,3,9,7]

money的每个元素的索引连接到years的相同索引元素,就当年花费的一些钱而言。我希望我的程序构建一个不同年份的新数组(删除years数组的相同值)和一个新的货币数组,其元素是每年对应的初始货币数组值的总和。

years_new=[2010,2011,2009,2008,2007]
money_new=[2+13,3+8,6,5+9+7,3]

我该怎么做呢?谢谢

4 个答案:

答案 0 :(得分:1)

这可能就是答案:

var years=[2010,2011,2009,2008,2010,2011,2007,2008,2008];
var money=[2,3,6,5,13,8,3,9,7];

fixed_years = Array();
for(var i=0; i < years.length; i++){
    console.log(fixed_years[years[i]]);
    if(fixed_years[years[i]]){
       fixed_years[years[i]] += money[i]; 
    }else{
        fixed_years[years[i]] = money[i];
    }

}
console.log(fixed_years);

new_years = Array();
new_money = Array();
for(year in fixed_years){
    new_years.push(year);
    new_money.push(fixed_years[year]);
}
console.log(new_money);

答案 1 :(得分:1)

您可以使用临时对象来保留计数值。

var years = [2010, 2011, 2009, 2008, 2010, 2011, 2007, 2008, 2008],
    money = [2, 3, 6, 5, 13, 8, 3, 9, 7],
    count = {}, i = 0,
    years_new = [],
    money_new = [];

while (i < years.length && i < money.length) {
    count[years[i]] = (count[years[i]] || 0) + money[i];
    i++;
}
years_new = Object.keys(count);
money_new = years_new.map(function (a) { return count[a]; });

document.write('<pre>' + JSON.stringify(years_new, 0, 4) + '</pre>');
document.write('<pre>' + JSON.stringify(money_new, 0, 4) + '</pre>');

或没有任何临时存储计数。此解决方案维护原始years数组的顺序。

var years = [2010, 2011, 2009, 2008, 2010, 2011, 2007, 2008, 2008],
    money = [2, 3, 6, 5, 13, 8, 3, 9, 7],
    i = 0, p,
    years_new = [],
    money_new = [];

while (i < years.length && i < money.length) {
    p = years_new.indexOf(years[i]);
    if (~p) {
        money_new[p] += money[i];
    } else {
        years_new.push(years[i]);
        money_new.push(money[i]);
    }
    i++;
}
document.write('<pre>' + JSON.stringify(years_new, 0, 4) + '</pre>');
document.write('<pre>' + JSON.stringify(money_new, 0, 4) + '</pre>');

第三个提案,如果years的索引不等于Array.prototype.indexOf,则会减少两个数组。然后它拼接两个数组并添加拼接值。

var years = [2010, 2011, 2009, 2008, 2010, 2011, 2007, 2008, 2008],
    money = [2, 3, 6, 5, 13, 8, 3, 9, 7],
    i = years.length, p,
    years_new = years,
    money_new = money;

while (i--) {
    p = years_new.indexOf(years_new[i]);
    if (p !== i) {
        years_new.splice(i, 1);
        money_new[p] += +money_new.splice(i, 1);
    }
}
document.write('<pre>' + JSON.stringify(years_new, 0, 4) + '</pre>');
document.write('<pre>' + JSON.stringify(money_new, 0, 4) + '</pre>');

答案 2 :(得分:1)

您可以使用Array.prototype.reduce方法创建对象。对象键是年份,它们的值是相应的 money 数组元素的总和。

var ret = years.reduce(function(ret, el, i) {
    ret[el] = (ret[el] || 0) + money[i];
    return ret;
}, {});

为了获得所有年份,您可以使用Object.keys方法:

var years_new = Object.keys(ret);
var money_new = years_new.map(function(el) { return ret[el] });

答案 3 :(得分:1)

这是另一种方法,使用以下帮助程序(请注意,任何其他uniq都可以使用,因为这不是有效的。)

<强>助手。

Array.prototype.uniq = function() {
  return this.reduce(function(sofar, cur) {
    return sofar.indexOf(cur) < 0 ? sofar.concat([cur]) : sofar;
  }, []);
};

Array.prototype.indicesOf = function(el) {
  return this.reduce(function(indices, cur, i) {
    return (cur === el) ? indices.concat(i) : indices;
  }, []);
};

<强>使用。

现在选择新年的任务是对uniq的简单调用:

var years_new = years.uniq();

要将旧money映射到所需的years,我们会累积旧money并使用每个索引来获取旧var money_new = years_new.map(function(ny) { return years.indicesOf(ny).reduce(function(sum, index) { return sum + money[index]; }, 0); }); 的总和:

$html = file_get_contents('result.html');
$dom = new DOMDocument;
$dom->loadHTML($html);
$tr = $dom->getElementsByTagName('tr');

foreach ($tr as $row){

    $td = $row->getElementsByTagName('td');
    $td1 = $td->item(1);
    $td2 = $td->item(2);

    foreach ($td1->childNodes as $node){
        $title = $node->textContent;      
    }

    foreach ($td2->childNodes as $node){
        $type = $node->textContent;
    }

}