我有一个obj数组,其中有些麻木,我想找到和。我知道如何通过一个简单的数组来实现这一点,但在这种情况下,似乎令人困惑。
我试图像平常一样在数组中使用reduce,但是没有用。
Future<int>GetRows(String Username,String Password) async{
var dbClient = await db;
var result = await dbClient.rawQuery("SELECT COUNT(*) FROM $Table WHERE $CoulmnUserName = $Username AND $CoulmnPassword = $Password");
return result.length;
}
例如,我知道我可以做到:
const arr = [{ some: 1 }, { some: 2 }, { some: 3 }]
const sumArr = arr.reduce((a, b) => a.some + b.some, 0)
console.log(sumArr)
如果我有一个像 const arr = [1, 2, 3, 4, 5]
const sumArr = arr.reduce((a, b) => a + b, 0)
console.log(sumArr)
这样的数组,我想为所有[{a: 1}, {a: 2}, {a: 3}, {b: 4}, {b: 5}]
找到sum
,并为所有a
做同样的事情。
答案 0 :(得分:1)
a
(累加器)没有some
属性,它是一个原始值,不是对象,因此您只需要以a
的身份访问,而b
代表当前循环中的对象,它是一个对象,因此您需要使用key
const arr = [{ some: 1 }, { some: 2 }, { some: 3 }]
const sumArr = arr.reduce((a, b) => a + b.some, 0)
console.log(sumArr)
答案 1 :(得分:1)
您的a
是累加器。它以0开头,听起来像您希望每次迭代都将其变成一个数字,以便最后,整个reduce
解析为一个数字。
改为使用(a, b) => a + b.some
:
const arr = [{ some: 1 }, { some: 2 }, { some: 3 }]
const sumArr = arr.reduce((a, b) => a + b.some, 0)
console.log(sumArr)
答案 2 :(得分:1)
其他答案解释了您的方法中的reducer问题。现在,对于问题的第二部分:您可以简化为一个对象,其中包含数组内对象中不同键的总和。换句话说,将累加器更改为对象并更改reducer-lambda。类似的东西(下面是jsfiddle的代码):
const raw = [{a: 1}, {a: 2}, {a: 3}, {b: 4}, {b: 5}];
const calcSums = someArray => someArray
.reduce( (sums, val) => {
Object.keys(val)
.forEach( v =>
sums[`sum-${v}`] = !sums[`sum-${v}`] ? val[v] : sums[`sum-${v}`] + val[v] );
return sums;
}, {} );
console.log(calcSums(raw));
// the method is generic, so this works too (as long as the values are numbers)
const raw2 = [{a: 1, b:3, c:7}, {a: 2}, {a: 3}, {b: 4}, {b: 5}, {c: 9}];
console.log(calcSums(raw2));