获取数组中的最后一项

到目前为止,这是我的JavaScript代码:

var linkElement = document.getElementById("BackButton");
var loc_array = document.location.href.split('/');
var newT = document.createTextNode(unescape(capWords(loc_array[loc_array.length-2]))); 
linkElement.appendChild(newT);

当前,它需要URL中数组的倒数第二个项目。但是,我想检查数组中的最后一项index.html是否正确,如果是,请改为抓取倒数第三项。

逆天西门2020/03/10 00:54:33

为了防止从原始数组中删除最后一项,您可以使用

Array.from(myArray).pop()

大多数浏览器(ES6)都受支持

Pro小卤蛋2020/03/10 00:54:33

您可以last()Array原型添加功能

Array.prototype.last = function () {
    return this[this.length - 1];
};
番长神乐小小2020/03/10 00:54:33

我个人会赞成kuporific / kritzikratzi的回答。如果您使用嵌套数组,则array [array.length-1]方法会变得非常难看。

var array = [[1,2,3], [4,5,6], [7,8,9]]
array.slice(-1)[0]
//instead of 
array[array.length-1]
//Much easier to read with nested arrays
array.slice(-1)[0].slice(-1)[0]
//instead of
array[array.length-1][array[array.length-1].length-1]
路易猴子Pro2020/03/10 00:54:33

如果您是来这里寻找的,这是更多的Javascript艺术

本着另一个使用的答案的精神reduceRight(),但简短一些:

[3, 2, 1, 5].reduceRight(a => a);

它基于这样的事实,如果您不提供初始值,则会选择最后一个元素作为初始值(请在此处查看文档)。由于回调只是不断返回初始值,因此最后一个元素将是最后返回的元素。

请注意,这应该被视为Javascript艺术,绝不是我推荐的方式,主要是因为它运行时间为O(n),而且还因为它损害了可读性。

现在要认真回答

我看到的最好方法(考虑到您希望它比更加简洁array[array.length - 1])是:

const last = a => a[a.length - 1];

然后只需使用函数:

last([3, 2, 1, 5])

如果要处理上面使用的匿名数组[3, 2, 1, 5]该函数实际上很有用,否则必须实例化两次,这样效率低下又难看:

[3, 2, 1, 5][[3, 2, 1, 5].length - 1]

啊。

例如,在这种情况下,您有一个匿名数组,必须定义一个变量,但是可以last()改用:

last("1.2.3".split("."));
L十三2020/03/10 00:54:33
const lastElement = myArray[myArray.length - 1];

从性能角度来看,这是最佳选择(比arr.slice(-1)快约1000倍)。

GO小胖2020/03/10 00:54:33

对于那些不怕重载Array原型的人(以及不应使用枚举屏蔽):

Object.defineProperty( Array.prototype, "getLast", {
    enumerable: false,
    configurable: false,
    writable: false,
    value: function() {
        return this[ this.length - 1 ];
    }
} );
逆天米亚2020/03/10 00:54:33

jQuery巧妙地解决了这个问题:

> $([1,2,3]).get(-1)
3
> $([]).get(-1)
undefined
达蒙Itachi理查德2020/03/10 00:54:33

如果想一次性获得最后一个要素,则可以使用Array#splice()

lastElement = document.location.href.split('/').splice(-1,1);

在这里,无需将拆分的元素存储在数组中,然后到达最后一个元素。如果获取最后一个元素是唯一目标,则应使用此元素。

注意:这将通过删除其最后一个元素来更改原始数组可以将其splice(-1,1)视为pop()弹出最后一个元素函数。

Gil樱Green2020/03/10 00:54:33

这个问题已经存在了很长时间,所以我很惊讶没有人提到只是将最后一个元素放到。之后pop()

arr.pop()与完全一样高效arr[arr.length-1],并且两者的速度相同arr.push()

因此,您可以摆脱:

---编辑[ 在推入之前thePop没有检查undefined] ---

let thePop = arr.pop()
thePop && arr.push(thePop)

---结束编辑---

可以减少到此速度(相同速度[EDIT:但不安全!]):

arr.push(thePop = arr.pop())    //Unsafe if arr empty

它的速度是的两倍arr[arr.length-1],但是您不必使用索引。在任何一天都值得黄金。

在我尝试过的解决方案中,以以下时间的执行时间单位(ETU)的倍数进行arr[arr.length-1]

[方法] .............. [ETUs 5个元素] ... [ETU 1百万个元素]

arr[arr.length - 1]      ------> 1              -----> 1

let myPop = arr.pop()
arr.push(myPop)          ------> 2              -----> 2

arr.slice(-1).pop()      ------> 36             -----> 924  

arr.slice(-1)[0]         ------> 36             -----> 924  

[...arr].pop()           ------> 120            -----> ~21,000,000 :)

最后三个选项,尤其[...arr].pop()是随着数组大小的增加,变得非常糟糕。在没有内存限制的计算机上,[...arr].pop()可能会保持120:1的比率。不过,没有人喜欢资源浪费。

乐小宇宙2020/03/10 00:54:33

我认为如果您只想获取元素而不删除,则使用此方法更简单:

arr.slice(-1)[0]

注意:如果数组为空(例如[]),它将返回undefined

顺便说一句...我没有检查性能,但我认为写起来更简单明了

猴子小小Mandy2020/03/10 00:54:33

可以通过使用带有负值slice方法来获取数组的最后一项

你可以阅读更多关于它在这里的底部。

var fileName = loc_array.slice(-1)[0];
if(fileName.toLowerCase() == "index.html")
{
  //your code...
}

使用pop()将更改数组,但这并不总是一个好主意。

JimGO2020/03/10 00:54:33

const [lastItem] = array.slice(-1);

带有-1的Array.prototype.slice可用于创建仅包含原始Array的最后一项的新Array,然后可以使用Destructuring Assignment使用该新Array的第一项来创建变量。

const lotteryNumbers = [12, 16, 4, 33, 41, 22];
const [lastNumber] = lotteryNumbers.slice(-1);

console.log(lotteryNumbers.slice(-1));
// => [22]
console.log(lastNumber);
// => 22

GO阿飞2020/03/10 00:54:33

我宁愿使用而array.pop()不是索引。

while(loc_array.pop()!= "index.html"){
}
var newT = document.createTextNode(unescape(capWords(loc_array[loc_array.length])));

这样,您总是可以得到index.html之前的元素(前提是您的数组将index.html隔离为一项)。注意:不过,您将丢失数组中的最后一个元素。

村村小小十三2020/03/10 00:54:33

您可以使用此模式...

let [last] = arr.slice(-1);

尽管它看起来不错,但是请记住,它会创建一个新的数组,因此它的效率不如其他解决方案,但几乎永远不会成为应用程序性能瓶颈。

逆天斯丁前端2020/03/10 00:54:32

“最干净的” ES6方法(IMO)为:

const foo = [1,2,3,4];
const bar = [...foo].pop();

这避免了变异foo,如.pop()将有,如果我们不使用的扩展操作。
也就是说,我也喜欢foo.slice(-1)[0]解决方案。

GO前端2020/03/10 00:54:32

有两种选择:

var last = arr[arr.length - 1]

要么

var last = arr.slice(-1)[0]

前者更快,但后者看起来更好

http://jsperf.com/slice-vs-length-1-arr

小卤蛋村村2020/03/10 00:54:32

不知道是否有缺点,但这似乎很简洁:

arr.slice(-1)[0] 

要么

arr.slice(-1).pop()

undefined如果数组为空,则两者都将返回

Tony樱番长2020/03/10 00:54:32

@chaiguy发布的内容的简短版本:

Array.prototype.last = function() {
    return this[this.length - 1];
}

读取-1索引undefined返回

编辑:

这些天来,人们似乎倾向于使用模块,以避免接触原型或使用全局名称空间。

export function last(array) {
    return array[array.length - 1];
}
TomGil村村2020/03/10 00:54:32

使用Array.pop

var lastItem = anArray.pop();

重要提示:这将返回最后一个元素并将 其从数组中删除