【问题标题】:how to write a function for shift without splice如何编写一个没有拼接的移位函数
【发布时间】:2015-11-02 06:22:34
【问题描述】:

我一直在尝试为一些基本的数组方法编写函数,但现在被困在不使用拼接的情况下重新创建移位。任何建议将不胜感激。

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

【问题讨论】:

  • shift 是什么意思?你能提供input数组和expected数组吗?
  • 你是说这个函数吗? Array.shift?
  • 如果您从数组的开头开始而不是向后循环,那么像您已经在做的那样在循环中向下滑动所有元素应该可以工作。虽然您需要保存原始第一个元素的值并从您的函数中返回它。

标签: javascript arrays function


【解决方案1】:

这是因为您的迭代方式,您将 i 的值更改为 i+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>

【讨论】:

  • 啊,是的,这是有道理的。这非常令人沮丧,谢谢。
【解决方案2】:

您可以使用Array.prototype.shift() 方法。

此方法从数组中删除第一个元素并返回该元素。这个方法改变了数组的长度。

https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/shift

【讨论】:

  • 看起来他们想自己重新创建一个shift() 方法。
  • 可能这个问题应该在代码审查中提出
  • 因为它更多的是关于算法而不是编程语言的使用。
  • @CharlieH on Code Review 有问题的代码需要工作。损坏的代码是题外话
  • 哦,好的。我不知道。 Code View 现在对我来说听起来超级酷。谢谢。
【解决方案3】:

你可以做这样的事情。

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]);

希望对你有帮助

【讨论】:

    猜你喜欢
    • 2011-03-17
    • 2023-03-07
    • 1970-01-01
    • 2013-11-30
    • 1970-01-01
    • 2011-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多