2015-11-02 52 views
4

我一直在尝试为一些基本的数组方法编写函数,但现在我坚持不使用拼接重新创建移位。任何建议将不胜感激。如何编写一个没有拼接的移位功能

MyShift = function (array) { 
    for (i = array.length - 2; i >= 0; i--) { 
     array[i] = array[i + 1]; 
    } 
    --array.length; 
}; 
+0

你所说的'shift'意思? 你能提供'input'数组和'expected'数组吗? – Rayon

+0

你是指这个功能? [Array.shift](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/shift)? – Grundy

+0

如果你从数组的开始处开始而不是向后循环,就像你已经在做的那样将所有元素滑动到循环中。尽管您需要保存原始第一个元素的值并将其从函数中返回。 – nnnnnn

回答

5

这是因为你是一个怎样的迭代,你是在ii+1改变值,则向后移动,所以你要分配的最后一个值的所有位置

MyShift = function(array) { 
 
    for (var i = 0; i < array.length - 1; i++) { 
 
    array[i] = array[i + 1]; 
 
    }; 
 
    --array.length; 
 
}; 
 

 
var a = ['a', 'b', 'c']; 
 
MyShift(a); 
 
document.body.appendChild(document.createTextNode(a))

在上面的例子中,当你第一次迭代循环时,你有i=1,所以你有array[1] = array[2],所以阵列变得[a, c, c],则下一个i=0所以你必须array[0] = array[1],但由于前一次迭代已经被更新的arra[1]值,你将有[c,c,c]

MyShift = function(array) { 
 
    snippet.log('src: ' + array) 
 
    for (i = array.length - 2; i >= 0; i--) { 
 
    array[i] = array[i + 1]; 
 
    snippet.log('loop ' + i + ': ' + array); 
 
    } 
 
    --array.length; 
 
}; 
 

 
var a = ['a', 'b', 'c']; 
 
MyShift(a); 
 
snippet.log('Result: ' + a)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<!-- Provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 --> 
 
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

+0

啊,是的,这是有道理的。这非常令人沮丧,谢谢。 –

0

你可以让这样的事情。

MyShift = function (array) { 
    for (i =0; i<array.length; i++) { 
     array[i] = array[i + 1]; 
     console.log(array[i]); 
    } 
    --array.length; 
    return(array); 
}; 
MyShift([1,2,3,4]); 

希望这将有助于