2016-12-26 114 views
1

我正在尝试编写一个函数,该函数使用forEach和array.shift()+ array.pop()连续添加数组的第一个和最后一个元素。迭代地在数组中添加第一个和最后一个数字

问题是for循环没有完成最内层的数字,所以数组总是留下2个值。

代码:

function choreAssignment(chores) { 
    chores.sort(function(a, b) {return a - b}); 
    var assignment = []; 
    chores.forEach(function() { 
    assignment.push((chores.pop() + chores.shift())); 
}); 
    return assignment.sort(function(a, b) {return a - b}); 
} 

上面的代码正常工作,但它留下的chores阵列内最里面的两个值。

例如,如果我运行:

代码:

var arr = [1, 4, 7, 2, 5, 9, 4, 3]; 
choreAssignment(arr); 

我得到:

[8, 9, 10] 

即,它增加了9 & 1,7 & 2,5 & 3 ,但它会在数组内部留下[4,4]。

我不知道这是为什么。谢谢。

+1

你举的例子和说明似乎并不匹配。我希望对于样本输入“[1,4,7,2,5,9,4,3]”,输出是'[4,8,16,7]'。 – pzp

+0

它首先将杂事算法从最小值排序到最大值。所以在它使用> shift()和pop()之前,值被列为[1,2,3,4,4,5,7,9],所以它们加在一起9 + 1,7 + 2和5 + 3 ,但由于某种原因,不是4 + 4。 –

回答

3

尝试改变的forEach到:

while (chores.length) { 
    assignment.push((chores.pop() + chores.shift())); 
} 

注意这是假定总有偶数个元素的数组

+0

谢谢,这工作。你能详细说明为什么这种方法有效,但是forEach没有?我不明白为什么一个人会工作,而不是另一个。 –

+0

@JonathanBechtel当你迭代它时,从数组中移除元素通常是一个坏主意。 – pzp

+0

@pzp感谢您的反馈。我正在考虑使用减少,但没有连接它的点,所以我用这种方法来代替。这不会用于生产,它只是踢轮胎。 –

相关问题