JavaScript的Array类没有提供一个last方法来检索数组的最后一个元素,这有点奇怪。我知道解决方法很简单(Ar [Ar.length-1]),但是这太常用了。
有什么严重的原因还没有纳入到Array类中吗?
JavaScript的Array类没有提供一个last方法来检索数组的最后一个元素,这有点奇怪。我知道解决方法很简单(Ar [Ar.length-1]),但是这太常用了。
有什么严重的原因还没有纳入到Array类中吗?
[10, 20, 30, 40].slice(-1)[0]
console.log([10, 20, 30, 40].slice(-1)[0])
可以添加到语言中的辅助方法数量是无限的。我想他们可能没有考虑添加这个。
您可以很容易地自定义一个。这就是JavaScript的力量。
if(!Array.prototype.last) {
Array.prototype.last = function() {
return this[this.length - 1];
}
}
var arr = [1, 2, 5];
arr.last(); // 5
然而,这可能会对第三方代码造成问题,这些代码(错误地)使用for..in
循环来迭代数组。
但是,如果你不受浏览器支持的限制,那么使用新的ES5语法来定义属性就可以解决这个问题,方法是将函数设置为不可枚举,如下所示:
Object.defineProperty(Array.prototype, 'last', {
enumerable: false,
configurable: true,
get: function() {
return this[this.length - 1];
},
set: undefined
});
var arr = [1, 2, 5];
arr.last; // 5
for..in
问题。虽然我们还没有广泛实现 ES5,但现在已经足够好了,因为各大浏览器包括 IE9 都在快速跟进。 - Anuragthis.length - 1
的值为 -1
,由于它是一个负数,因此被视为数组的属性而不是元素索引。 - claymation由于 JavaScript 变化缓慢。这是因为人们升级浏览器的速度很慢。
许多 JavaScript 库都实现了自己的 last()
函数。使用其中一个!
last()
函数。问题涉及JavaScript核心语言本身的开发性质。 - Kenan Banks另一个选择,特别是如果您已经在使用UnderscoreJS,那么可以考虑:
_.last([1, 2, 3, 4]); // Will return 4
Array.prototype.last = Array.prototype.last || function() {
var l = this.length;
return this[l-1];
}
x = [1,2];
alert( x.last() )
null
还是 undefined
? - Álvaro Gonzálezthis[l-1]
会使得你得到undefined
,因为访问不存在的属性通常会得到这个结果。个人而言,我更希望 JavaScript 抛出一个异常而不是返回 undefined
,但是 JavaScript 更喜欢隐藏错误。 - bobince我自己也在寻找这个问题的答案。最好的方法可能是使用"slice",但我还是创建了一个"last"函数来练习扩展原型,所以我想分享一下。与其他一些方法相比,它有额外的好处,可以让你选择向后计数,并获取倒数第二或倒数第三个项目。如果您没有指定计数,它将默认为1并提取最后一个项目。
Array.prototype.last = Array.prototype.last || function(count) {
count = count || 1;
var length = this.length;
if (count <= length) {
return this[length - count];
} else {
return null;
}
};
var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
arr.last(); // returns 9
arr.last(4); // returns 6
arr.last(9); // returns 1
arr.last(10); // returns null
last(4)
或 last(9)
时,您会失去函数名称的含义,即 last
。 - Prashanth Shyamprasad这里有一种更简单的方法来切片最后几个元素。
var tags = [1, 2, 3, "foo", "bar", "foobar", "barfoo"];
var lastObj = tags.slice(-1);
lastObj
现在是["barfoo"]
。
Python也是这样做的,当我尝试使用JS时它也起作用了。我猜脚本语言中的字符串操作方式是相同的。
同样地,如果你想要一个数组中最后两个对象,
var lastTwoObj = tags.slice(-2)
会给你["foobar", "barfoo"]
等等。
lastObj
将包含 ["barfoo"]
。无论如何,为什么我要使用 Array.prototype.slice.call(tags)
而不是直接使用 tags.slice
? - user663031pop()
方法将弹出数组中的最后一个值。但问题在于您将失去数组中的最后一个值。
是的,或者只是:
var arr = [1, 2, 5];
arr.reverse()[0]
如果你想要的是值,而不是一个新列表。
item = array.pop()
。 - bobincearray[array.length-1]
比其他方法快多了。 - Jondlm(Ar[Ar.length-1])
的性能提高了20倍。 - Evgeni Sergeev