Javascript 中的链接方法错误
Chaining Methods error in Javascript
我想知道这段简单的代码失败的原因:
var arr = [1, 2, 3];
arr.push(arr[0]).shift();
console.log(arr);
它 returns 在 firebug 控制台 "TypeError: arr.push(...).shift is not a function"
我认为这是因为我调用的 shift() 方法不是在数组上而是在推送的元素上。
是否有更优雅的方法来获得与
相同的结果
var arr = [1, 2, 3];
arr.push(arr[0]);
arr.shift();
console.log(arr);
生产 ?
提前致谢!
来自the MDN:
The push() method adds one or more elements to the end of an array and
returns the new length of the array.
arr.push(arr[0])
不是 return 数组,而是一个显然没有 shift
函数的数字。
据我所知,没有简单的表达式将元素推送到数组并 returning 该数组。但在您的情况下,您可以简单地反转操作并执行
arr.push(arr.shift());
I think it happens because I invoke the shift() method not on an array but on the pushed element.
差不多。 push
returns 数组的新长度。一个数字显然没有 shift()
方法。
你把它放在两行的方法是最简单的方法。
本质上这个问题是在说,我能以某种方式"elegantly"表达将数组的第一项移动到末尾的概念吗?幸运的是,JS 是一种图灵完备的语言,它允许我们定义函数,所以 "elegant" 答案只是
rotate(arr)
现在只剩下定义rotate
了。旋转就是drop结果中的第一个元素addhead元素到最后:
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; }
另一种方法
我还可以编写一个函数,使用 splice
将 n
个元素从位置 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); }
我想知道这段简单的代码失败的原因:
var arr = [1, 2, 3];
arr.push(arr[0]).shift();
console.log(arr);
它 returns 在 firebug 控制台 "TypeError: arr.push(...).shift is not a function"
我认为这是因为我调用的 shift() 方法不是在数组上而是在推送的元素上。
是否有更优雅的方法来获得与
相同的结果var arr = [1, 2, 3];
arr.push(arr[0]);
arr.shift();
console.log(arr);
生产 ?
提前致谢!
来自the MDN:
The push() method adds one or more elements to the end of an array and returns the new length of the array.
arr.push(arr[0])
不是 return 数组,而是一个显然没有 shift
函数的数字。
据我所知,没有简单的表达式将元素推送到数组并 returning 该数组。但在您的情况下,您可以简单地反转操作并执行
arr.push(arr.shift());
I think it happens because I invoke the shift() method not on an array but on the pushed element.
差不多。 push
returns 数组的新长度。一个数字显然没有 shift()
方法。
你把它放在两行的方法是最简单的方法。
本质上这个问题是在说,我能以某种方式"elegantly"表达将数组的第一项移动到末尾的概念吗?幸运的是,JS 是一种图灵完备的语言,它允许我们定义函数,所以 "elegant" 答案只是
rotate(arr)
现在只剩下定义rotate
了。旋转就是drop结果中的第一个元素addhead元素到最后:
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; }
另一种方法
我还可以编写一个函数,使用 splice
将 n
个元素从位置 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); }