具有条件的数组的总和
Sum of an array with a condition
我想求和数组中具有相同年份的元素值。
var newData = [];
var data = new Array(['2013', 0], ['2013', 0],['2016', 15], ['2017', 2], ['2015', 1], ['2013', 0], ['2016', 12], ['2014', 0], ['2017', 3], ['2015', 1], ['2013', 21], ['2013', 2]);
var sum = data.reduce(function (a, b,i) {
if (b[0][i]==b[0][i+1]) {
return newData.push(b[0],a + b[1]);
}
}, 0);
console.log(newData);
//return to:
[
["2013",23],
["2014",0],
["2015",2],
["2016",27],
["2017",5]
]
可能吗?
感谢您的帮助
您可以像这样创建自己的简单且更易于理解的自定义逻辑
获取 JSON 对象作为响应。
var newData = [];
var data = new Array(['2013', 0], ['2013', 0],['2016', 15], ['2017', 2], ['2015', 1], ['2013', 0], ['2016', 12], ['2014', 0], ['2017', 3], ['2015', 1], ['2013', 21], ['2013', 2]);
var res = {};
data.forEach((item)=>{
if(Object.keys(res).includes(item[0])){
res[item[0]] += item[1];
} else {
res[item[0]] = item[1];
}
});
console.log(res);
.as-console-wrapper { max-height: 100% !important; top: 0; }
获取JSON数组作为响应。
var newData = [];
var data = new Array(['2013', 0], ['2013', 0],['2016', 15], ['2017', 2], ['2015', 1], ['2013', 0], ['2016', 12], ['2014', 0], ['2017', 3], ['2015', 1], ['2013', 21], ['2013', 2]);
var res = [];
data.forEach((item)=>{
var found = false;
for(var i=0; i<res.length; i++){
if(res[i][0] === item[0]){
res[i][1] += item[1];
found = true;
break;
}
}
if(!found){
res.push(item);
}
});
console.log(res);
.as-console-wrapper { max-height: 100% !important; top: 0; }
如果我明白你需要什么,那就试试这个
var sums=data.reduce(function(a,b){
a[b[0]]=(a[b[0]] || 0)+b[1];
},{});
您可以使用 ES6 Map
和 reduce
方法按年对值求和并扩展语法 ...
从 Map 获取数组。
var data = new Array(['2013', 0], ['2013', 0], ['2016', 15], ['2017', 2], ['2015', 1], ['2013', 0], ['2016', 12], ['2014', 0], ['2017', 3], ['2015', 1], ['2013', 21], ['2013', 2]);
const result = data.reduce((r, [y, v]) => {
r.set(y, (r.get(y) || 0) + v);
return r;
}, new Map)
console.log([...result]);
完成这项工作的一种非常快速的方法是使用 JS 的稀疏数组并挑选出 non-empty 个插槽;
var data = [['2013', 0], ['2013', 0],['2016', 15], ['2017', 2], ['2015', 1], ['2013', 0], ['2016', 12], ['2014', 0], ['2017', 3], ['2015', 1], ['2013', 21], ['2013', 2]],
interim = data.reduce((r,e) => (r[+e[0]] && (r[+e[0]][1] += e[1]) || (r[+e[0]] = e), r), []),
result = Object.keys(interim)
.map(k => interim[k]);
console.log(result);
.as-console-wrapper {
height : 100%;
max-height : 100% !important
}
所以 Object.keys(interim)
部分只是以极快的方式过滤掉带有未定义键的槽。所以没什么可担心的。检查一下;
var a = [],
b = [];
a[1000000000] = "west";
a[500000000] = "test";
a[0] = "best";
console.time("test");
b = Object.keys(a)
.map(k => a[k]);
console.timeEnd("test");
console.log(b);
我想求和数组中具有相同年份的元素值。
var newData = [];
var data = new Array(['2013', 0], ['2013', 0],['2016', 15], ['2017', 2], ['2015', 1], ['2013', 0], ['2016', 12], ['2014', 0], ['2017', 3], ['2015', 1], ['2013', 21], ['2013', 2]);
var sum = data.reduce(function (a, b,i) {
if (b[0][i]==b[0][i+1]) {
return newData.push(b[0],a + b[1]);
}
}, 0);
console.log(newData);
//return to:
[
["2013",23],
["2014",0],
["2015",2],
["2016",27],
["2017",5]
]
可能吗? 感谢您的帮助
您可以像这样创建自己的简单且更易于理解的自定义逻辑
获取 JSON 对象作为响应。
var newData = [];
var data = new Array(['2013', 0], ['2013', 0],['2016', 15], ['2017', 2], ['2015', 1], ['2013', 0], ['2016', 12], ['2014', 0], ['2017', 3], ['2015', 1], ['2013', 21], ['2013', 2]);
var res = {};
data.forEach((item)=>{
if(Object.keys(res).includes(item[0])){
res[item[0]] += item[1];
} else {
res[item[0]] = item[1];
}
});
console.log(res);
.as-console-wrapper { max-height: 100% !important; top: 0; }
获取JSON数组作为响应。
var newData = [];
var data = new Array(['2013', 0], ['2013', 0],['2016', 15], ['2017', 2], ['2015', 1], ['2013', 0], ['2016', 12], ['2014', 0], ['2017', 3], ['2015', 1], ['2013', 21], ['2013', 2]);
var res = [];
data.forEach((item)=>{
var found = false;
for(var i=0; i<res.length; i++){
if(res[i][0] === item[0]){
res[i][1] += item[1];
found = true;
break;
}
}
if(!found){
res.push(item);
}
});
console.log(res);
.as-console-wrapper { max-height: 100% !important; top: 0; }
如果我明白你需要什么,那就试试这个
var sums=data.reduce(function(a,b){
a[b[0]]=(a[b[0]] || 0)+b[1];
},{});
您可以使用 ES6 Map
和 reduce
方法按年对值求和并扩展语法 ...
从 Map 获取数组。
var data = new Array(['2013', 0], ['2013', 0], ['2016', 15], ['2017', 2], ['2015', 1], ['2013', 0], ['2016', 12], ['2014', 0], ['2017', 3], ['2015', 1], ['2013', 21], ['2013', 2]);
const result = data.reduce((r, [y, v]) => {
r.set(y, (r.get(y) || 0) + v);
return r;
}, new Map)
console.log([...result]);
完成这项工作的一种非常快速的方法是使用 JS 的稀疏数组并挑选出 non-empty 个插槽;
var data = [['2013', 0], ['2013', 0],['2016', 15], ['2017', 2], ['2015', 1], ['2013', 0], ['2016', 12], ['2014', 0], ['2017', 3], ['2015', 1], ['2013', 21], ['2013', 2]],
interim = data.reduce((r,e) => (r[+e[0]] && (r[+e[0]][1] += e[1]) || (r[+e[0]] = e), r), []),
result = Object.keys(interim)
.map(k => interim[k]);
console.log(result);
.as-console-wrapper {
height : 100%;
max-height : 100% !important
}
所以 Object.keys(interim)
部分只是以极快的方式过滤掉带有未定义键的槽。所以没什么可担心的。检查一下;
var a = [],
b = [];
a[1000000000] = "west";
a[500000000] = "test";
a[0] = "best";
console.time("test");
b = Object.keys(a)
.map(k => a[k]);
console.timeEnd("test");
console.log(b);