获取数组中的最后一项

这是我的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”,如果是这样,抓住倒数第三个项目。

 if(loc_array[loc_array.length-1] == 'index.html'){ //do something }else{ //something else. } 

如果您的服务器为“index.html”和“inDEX.htML”提供相同的文件,则还可以使用: .toLowerCase()

尽pipe如此,如果可能的话,你可能会考虑做这个服务器端:它会更清洁,并为没有JS的人工作。

不确定是否有缺点,但这似乎相当简洁:

 arr.slice(-1)[0] 

要么

 arr.slice(-1).pop() 

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

使用Array.pop :

 var lastItem = anArray.pop(); 

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

@chaiguy发布的简短版本:

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

读取-1索引返回undefined

两个选项是:

 var last = arr[arr.length - 1] 

要么

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

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

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

以下是如何获得它对原始arrays没有影响

 a = [1,2,5,6,1,874,98,"abc"]; a.length; //returns 8 elements 

如果你使用pop(),它会修改你的数组

 a.pop(); // will return "abc" AND REMOVES IT from the array a.length; // returns 7 

但是你可以使用它,所以它对原始数组没有影响

 a.slice(-1).pop(); // will return "abc" won't do modify the array // because slice creates a new array object a.length; // returns 8; no modification and you've got you last element 

我宁愿使用array.pop()比索引。

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

这样你总是得到index.html之前的元素(提供你的数组有独立的index.html作为一个项目)。 注意:尽pipe如此,你将失去数组中的最后一个元素。

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

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

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

使用pop()会改变你的数组,这并不总是一个好主意。

“最干净”的ES6方式(IMO)将是:

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

这避免了突变foo,因为我们不使用扩散运算符就会popup。 这就是说,我更喜欢foo.slice(-1)[0]解决scheme。

jQuery很好地解决了这个问题:

 > $([1,2,3]).get(-1) 3 > $([]).get(-1) undefined 

我通常使用underscorejs ,你可以做

 if (_.last(loc_array) === 'index.html'){ etc... } 

对我来说,这比loc_array.slice(-1)[0]

对于那些不怕重载数组原型(并且不应该使用枚举掩码 ):

 Object.defineProperty( Array.prototype, "getLast", { enumerable: false, configurable: false, writable: false, value: function() { return this[ this.length - 1 ]; } } ); 

如果想一次性得到最后一个元素,他/她可以使用Array#splice()

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

这里,不需要将拆分元素存储在数组中,然后到达最后一个元素。 如果得到最后一个元素是唯一的目标,应该使用这个。

注意: 这将通过删除最后一个元素来更改原始数组 。 把splice(-1,1)想象成一个pop()最后一个元素的pop()函数。

我个人会通过kuporific / kritzikratzi upvote回答。 如果使用嵌套数组,数组[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]  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]  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]  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]  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]  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]  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]  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] 
 var lastElement = arr[arr.length - 1]; 

从性能angular度来看,这是最好的select(约比arr.slice(-1)快1000倍)。

我认为最简单和超低效的方法是:

 var array = ['fenerbahce','arsenal','milan']; var reversed_array = array.reverse(); //inverts array [milan,arsenal,fenerbahce] console.log(reversed_array[0]) // result is "milan". 

您可以添加一个新的属性getter到Array的原型,以便通过Array所有实例都可以访问它。

Getters允许你访问函数的返回值,就像它是一个属性的值一样。 函数的返回值当然是数组的最后一个值( this[this.length - 1] )。

最后你把它包装成一个条件,检查last属性是否仍然是undefined (未由另一个可能依赖它的脚本定义)。

 if(typeof Array.prototype.last === 'undefined') { Object.defineProperty(Array.prototype, 'last', { get : function() { return this[this.length - 1]; } }); } // Now you can access it like [1, 2, 3].last; // => 3 // or var test = [50, 1000]; alert(test.last); // Says '1000' 

在IE≤8时不起作用。

你可以使用这种模式…

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

虽然它读起来很好,但请记住它会创build一个新的arrays,所以它的效率比其他解决scheme低,但几乎不会成为应用程序性能瓶颈。

你可以添加一个last()函数给Array原型。

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

使用ES6 / ES2015扩展运算符(…)可以执行以下操作。

 const data = [1, 2, 3, 4] const [last] = [...data].reverse() console.log(last) 

我会build议创build帮助函数,并且每次重用它,你都需要它。 让函数更通用,不仅可以得到最后一个项目,而且还可以得到最后一个项目等等。

 function last(arr, i) { var i = i || 0; return arr[arr.length - (1 + i)]; } 

用法很简单

 var arr = [1,2,3,4,5]; last(arr); //5 last(arr, 1); //4 last(arr, 9); //undefined 

现在,让我们解决原来的问题

抓住倒数第二个表单数组。 如果loc_array中的最后一项是“index.html”,则取而代之的是倒数第三项。

下一行完成这项工作

 last(loc_array, last(loc_array) === 'index.html' ? 2 : 1); 

所以,你需要重写

 var newT = document.createTextNode(unescape(capWords(loc_array[loc_array.length-2]))); 

通过这种方式

 var newT = document.createTextNode(unescape(capWords(last(loc_array, last(loc_array) === 'index.html' ? 2 : 1)))); 

或者使用额外的variables来提高可读性

 var nodeName = last(loc_array, last(loc_array) === 'index.html' ? 2 : 1); var newT = document.createTextNode(unescape(capWords(nodeName))); 

这会工作吗?

 if (loc_array.pop() == "index.html"){ var newT = document.createTextNode(unescape(capWords(loc_array[loc_array.length-3]))); } else{ var newT = document.createTextNode(unescape(capWords(loc_array[loc_array.length-2]))); } 

您也可以在不从URL中提取数组的情况下实现此问题

这是我的select

 var hasIndex = (document.location.href.search('index.html') === -1) ? doSomething() : doSomethingElse(); 

!问候

使用reduceRight :

 [3,2,1,5].reduceRight((a,v) => { return a?a:v; }); 

还有一个npm模块, last添加到Array.prototype

 npm install array-prototype-last --save 

用法

 require('array-prototype-last'); [1, 2, 3].last; //=> 3 [].last; //=> undefined 

箭头函数使得执行速度最快的方法更加简洁,不需要重复数组的名称。

 var lastItem = (a => a[a.length - 1])(loc_array); 

使用lodash _.last(array)获取数组的最后一个元素。

 data = [1,2,3] last = _.last(data) console.log(last) 
 <script src="ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>