首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >尝试创建一个平衡值的泛型函数(不确定如何准确地表达它)

尝试创建一个平衡值的泛型函数(不确定如何准确地表达它)
EN

Stack Overflow用户
提问于 2019-08-31 05:35:57
回答 2查看 34关注 0票数 0

给定一个像这样的数组:

代码语言:javascript
复制
var buckets = [
  {name: "bucket1", value: 10000},
    {name: "bucket2", value: -5000},
    {name: "bucket3", value: -2000},
]

我正在尝试将负数“清零”。在给定的每种情况下,所有值相加的总和永远不会为负。我所说的“清零”的意思是取任何正数,然后按出现的顺序将它们减去负数。

所以如果第一个数和第三个数是负的,第二个数是正的,它会把第二个数减第一个数,然后再减第三个数。

之后,我的示例的结束值将分别为3000,0,0-。

这些数字可以以任何组合和顺序出现,只要它们的和都是正数。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-08-31 05:46:39

这不是最好的解决方案,但是像这样的东西应该可以工作。

伪码:

代码语言:javascript
复制
// for every item in the bucket
for(var i = 0; i < buckets.length; i++){

  // if the value of this bucket is negative
  if(buckets[i].value < 0) {

    // look through every bucket again
    for(var j = 0; j < buckets.length; j++) {

      // and if we find one that is positive
      if(buckets[j].value > 0) {

        // add all the positive to this negative
        buckets[i].value += buckets[j].value;

        // if it's still negative we are gonna start again
        if(buckets[i].value < 0) {

          i--;
          break;
        }
      }
    }
  }
} 
票数 2
EN

Stack Overflow用户

发布于 2019-08-31 06:23:47

您可以在数组上执行reduce,并通过正/负值分隔存储桶。然后迭代负片,将每个负片减去一个正数,直到它达到零,然后根据需要移动到下一个。

代码语言:javascript
复制
var buckets=[{name:"bucket1",value:1e4},{name:"bucket2",value:-5e3},{name:"bucket3",value:-2e3}],
	result = buckets.reduce( ( a, v, i, {
		length
	} ) => {
		let isNeg = Math.sign( v.value ) == -1;
		isNeg ? a.n.push( v ) : a.p.push( v );
		if ( i < length - 1 ) {
			return a;
		} else {
			return [ ...a.n.map( n => {
				while ( n.value < 0 ) {
					let pos = a.p.find( ( {
							value
						} ) => value > 0 ),
						tval = n.value + pos.value,
						nval, posval;
					if ( tval >= 0 ) {
						nval = 0;
						posval = tval;
					} else {
						nval = tval;
						posval = pos.value + n.value;
					}
					pos.value = posval;
					n.value = nval;
				}
				return n;
			} ), ...a.p ]
		}
	}, {
		p: [],
		n: []
	} );
console.log( result );

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57733465

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档