Javascript

时间:2015-05-06 15:32:35

标签: javascript arrays chaining

我想知道这段简单代码失败的原因:

var arr = [1, 2, 3];
arr.push(arr[0]).shift();
console.log(arr);

它在firebug控制台中返回“TypeError:arr.push(...)。shift不是函数”

我认为这是因为我调用了shift()方法而不是在数组上,而是在push元素上调用。

是否有一种更优雅的方式来获得相同的结果,

var arr = [1, 2, 3];
arr.push(arr[0]);
arr.shift();
console.log(arr);

生产?

提前致谢!

3 个答案:

答案 0 :(得分:3)

来自the MDN

  

push()方法将一个或多个元素添加到数组的末尾   返回数组的新长度。

arr.push(arr[0])没有返回数组,但显然没有shift函数的数字。

据我所知,没有简单的表达式将元素推送到数组并返回该数组。但在您的情况下,您可以简单地撤消操作并执行

arr.push(arr.shift());

答案 1 :(得分:1)

  

我认为这是因为我调用了shift()方法而不是在数组上,而是在push元素上调用。

几乎。 push返回数组的新长度。一个数字显然没有shift()方法。

将它放在两行上的方法是最简单的方法。

答案 2 :(得分:0)

基本上这个问题是说,我可以以某种方式"优雅"表达将数组的第一项移动到最后的概念。幸运的是,JS是一种图灵完备语言,它允许我们定义函数,因此"优雅"答案就是

public void CustomPaste(Office.IRibbonControl control, bool cancelDefault)
        {
            //Globals.ThisAddin.Application.Selection.Paste();
            //Check if the pasted content is image and then add caption to it


        }

现在仅仅定义rotate(arr) 。旋转是删除 添加 head 元素结果中的第一个元素到结尾:

rotate

现在function rotate(arr) { return drop(add(arr, head(arr))); }

drop

function drop(arr) { return arr.shift(), arr; } 当然是

head

function head(arr) { return arr[0]; }

add

另一种方法

我还可以编写一个函数,使用function add(arr, elt) { return arr.push(elt), arr; } n元素从位置i移动到位置j,如下所示:

splice

然后function move(arr, n, i, j) { arr.splice.apply(arr, [j-n+1, 0].concat(arr.splice(i, n))); return arr; } 移动一个元素开头结束

rotate