【问题标题】:Chaining Methods error in JavascriptJavascript中的链接方法错误
【发布时间】:2015-05-06 15:32:35
【问题描述】:

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

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

它在萤火虫控制台中返回“TypeError: arr.push(...).shift is not a function”

我认为这是因为我不是在数组上而是在推送的元素上调用 shift() 方法。

有没有更优雅的方法来获得相同的结果,

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

生产?

提前致谢!

【问题讨论】:

  • 这里的近距离投票很奇怪......投票前请阅读问题直到最后。
  • 如果我做错了什么,我很抱歉。正如你从我的代表那里看到的那样,我不是你可以称之为老手的人,也许我错过了一些东西。

标签: javascript arrays chaining


【解决方案1】:

来自the MDN

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

arr.push(arr[0]) 不返回数组,而是返回一个数字,显然没有shift 函数。

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

arr.push(arr.shift());

【讨论】:

  • @torazaburo 否:concat 返回一个新数组
【解决方案2】:

我认为这是因为我不是在数组上而是在推送的元素上调用 shift() 方法。

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

你把它放在两行的方法是最简单的方法。

【讨论】:

  • “最简单的”?看看我的回答;)
【解决方案3】:

本质上,这个问题是在说,我能否以某种方式“优雅地”表达将数组的第一项移动到末尾的概念。幸运的是,JS 是图灵完备的语言,它允许我们定义函数,所以“优雅”的答案只是

rotate(arr)

现在只需定义rotate。旋转是将 添加 head 元素到末尾的结果中的第一个元素drop

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; }

另一种方法

我还可以编写一个函数,使用splicen 元素从位置i 移动到位置j,如下所示:

function move(arr, n, i, j) {
    arr.splice.apply(arr, [j-n+1, 0].concat(arr.splice(i, n)));
    return arr;
}

那么到rotate就是移动一个元素开头结尾

function rotate(arr) { return move(arr, 1, 0, 999); }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-11
    • 2013-12-09
    • 1970-01-01
    • 2020-05-05
    相关资源
    最近更新 更多