获取数组中的最后一项
这是我的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]
前者更快,但后者看起来更好
以下是如何获得它对原始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>