我试图在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]
我该怎么做呢?谢谢
答案 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;
}
}