我需要加总或减去数组的值。
例如:
func dLog(message: Any, filename: String = #file, function: String = #function, line: Int = #line) {
#if DEBUG
print("[\(filename.lastPathComponent):\(line)] \(function) - \(message)")
#else
CLSLogv("[\(filename.lastPathComponent):\(line)] \(function) - \(message)", getVaList([""]))
#endif
}
dLog(object)
应表示为:[1, 5, 10]
。
并且1 + 5 + 10 = 16
应该是:[1, 5, -1, 10, 5]
1 + 5 - 10 - 5
数字表示减法或总和取决于-1
的位置。第一个-1
将指示减法,第二个-1
表示一切都回到常规总和,因为一切都在开头,第三个将再次减法,依此类推。
现在看看它应该是2 -1
:-1
,它
应该表示为:[1, 5, -1, 10, 5, -1, 5, 5]
,得到了吗?
所以,所有内容都应该总结,直到数组包含1 + 5 - 10 - 5 + 5 + 5
,因此它会更改为subraction,如果还有另一个-1
,则操作应该更改为sum。依此类推,每当有一个新的'-1'时,操作就会发生变化。
我正在做这样的计算:
-1
有什么建议吗?
答案 0 :(得分:3)
这是我的简短Array.prototype.reduce
解决方案:
[1, 5, -1, 10, 5, -1, 5, 5].reduce(function(ctx, x) {
if (x === -1) // if the current value is -1 ...
ctx.sign *= -1; // - change the sign
else // otherwise ...
ctx.sum += x * ctx.sign; // - transform according to the sign
return ctx; // return context
}, { sign: 1, sum: 0 }).sum;
答案 1 :(得分:3)
您可以使用变量来决定是添加还是减去实际值。
function sum(array){
var negative;
return array.reduce(function (a, b) {
if (b === -1) {
negative = !negative;
return a;
}
return negative ? a - b : a + b;
}, 0);
}
console.log(sum([1, 5, 10]));
console.log(sum([1, 5, -1, 10, 5]));
console.log(sum([1, 5, -1, 10, 5, -1, 5, 5]));
答案 2 :(得分:1)
您可以使用一个var
并在每次元素中的元素true/false
时更改-1
function sum(a) {
var check = true, result = 0;
a.forEach(function(e) {
//If e is negative number and check is true change check to false
if (e < 0 && check == true) {
check = false;
//If e is negative number and check is false change check to true
} else if (e < 0 && check == false) {
check = true;
}
//If e is positive number and check is true add to result
if (e > 0 && check == true) {
result += e;
//If e is positive number and check is false subtract of result
} else if (e > 0 && check == false) {
result -= e;
}
})
return result;
}
console.log(sum([1, 5, 10]));
console.log(sum([1, 5, -1, 10, 5]));
console.log(sum([1, 5, -1, 10, 5, -1, 5, 5]));
&#13;
答案 3 :(得分:1)
添加另一个混合,不是因为它更好,而是因为它可能:)(虽然这个版本确实依赖于ES6)
function calc(arr){
var [v,...rest] = arr; //assign v to the first value, rest to the following values
var sr = rest.length ? calc(rest) : 0; //calc sum of rest
return v === -1 ? -sr : v + sr; //if value === -1, return sum of rest with reversed sign, otherwise return sum
}
console.log(calc([1, 5, 10]));
console.log(calc([1, 5, -1, 10, 5]));
console.log(calc([1, 5, -1, 10, 5, -1, 5, 5]));