【问题标题】:get the second to last item of an array?获取数组的倒数第二项?
【发布时间】:2011-06-27 21:13:04
【问题描述】:

如何获取数组中的最后第二项?

例如,

var fragment = '/news/article-1/'
var array_fragment = fragment.split('/');
var pg_url = $(array_fragment).last()[0];

这将返回一个空值。但我想得到article-1

谢谢。

【问题讨论】:

标签: javascript jquery arrays


【解决方案1】:

并非所有事情都必须使用 jQuery 来完成。

在普通的旧javascript中你可以这样做:

var pg_url = array_fragment[array_fragment.length - 2]

更简单,更快:)

【讨论】:

  • 如果 array_fragment.length == 1 失败
  • @James:失败为“不返回任何东西”,还是失败为错误?当我测试它时,它只是返回undefined
  • @James 实际上并没有失败...当您访问未在数组中索引的元素时,默认行为是返回undefined(例如[1,2,3][10] === [1,2,3][-1]
  • 这种方法的问题是你不能链接它:'a/b/c/d'.split('/').slice(-2, -1)[0] === 'c'
  • 谢谢@Pablo,这是一个使用这种方法并避免未定义和负变量的示例。 jsfiddle.net/xd5cq4rz
【解决方案2】:

看来你也可以使用Javascript的slice方法:

var path = 'a/b/c/d';
path.split('/').slice(-2, -1)[0]; // c

您也可以将“数组中倒数第二个元素”视为“数组的第二个元素反转”:

var path = 'a/b/c/d';
path.split('/').reverse()[1]; // c

【讨论】:

  • 只是一个建议,但这看起来更具可读性:倒数第二个:path.split('/').slice(-2).reverse().pop() 倒数第三个:path.split('/').slice(-3).reverse().pop() 倒数第四个:path.split('/').slice(-4).reverse().pop()
【解决方案3】:

第一步:使用 split() 方法将元素拆分成一个数组。

var fragment_arr = fragment.split("/");

第2步:使用slice(-2)方法从数组中选择最后2个元素,负数从数组末尾选择。

var lastTwo = fragment_arr.slice(-2);

第三步:lastTwo数组包含fragment_arr的最后两个元素,现在可以这样访问了

var element = lastTwo[0];
alert(element);

简答:您可以像下面这样结合第 2 步和第 3 步

var element = fragment_arr.slice(-2)[0];
alert(element);

【讨论】:

  • 如果你的答案只是“试试这个”,那不是答案。这是一条评论。要写一个有用的答案,请添加描述。
  • 这并没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方留下评论。 - From Review
  • @DanielCheung - 我想,我更新了你的期望,我学会了如何提出答案。谢谢你。
【解决方案4】:

arr.at(-2); 会做到这一点 - 它返回数组中的最后第二项。


const arr = [1,2,3,4];
arr.at(-2); // Returns 3

at() 方法采用正整数或负整数并返回该索引处的项目。负整数从数组的最后一项开始倒数。

文档:Array/at

【讨论】:

    【解决方案5】:

    这可以通过 lodash _.nth:

    var fragment = '/news/article-1/'
    var array_fragment = _.split(fragment, '/');
    var second_last = _.nth(array_fragment, -2);
    console.log(second_last);
    <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js"></script>

    【讨论】:

      【解决方案6】:
      var pg_url = array_fragment[array_fragment.length -2]
      

      array_fragment 不是 jquery 变量,它是一个普通的旧 javascript 变量,所以不需要 $()

      【讨论】:

        【解决方案7】:

        这个问题很老但仍然相关。长度为 1 的切片是最好的选择,但可以使用下划线/lodash 替代:

        _.initial() 获取除最后一个以外的所有内容

        _.last() 获取最后一个

        所以你可以这样做

        _.last(_.initial([1,2,3,4])) 
        

        或链式:

        _.chain([1,2,3,4])
         .initial()
         .last()
         .value();
        

        这会给你 3。

        或者在原来的问题中:

        var fragment = '/news/article-1/'
        var array_fragment = fragment.split('/');
        var pg_url = _.chain(array_fragment).initial().last().value();
        

        【讨论】:

          【解决方案8】:

          如果经常需要反向访问数组,而不仅仅是倒数第二个索引,则可以使用对原型的简单扩展。

          在扩展和使用 Array 原型一样大的东西时,请确保您不会影响其使用的任何其他部分。这是通过确保该属性不可枚举来完成的,这样for in 就不会在其他任何地方阻塞(有些人和图书馆使用for in 来迭代数组)。

          Object.defineProperty(Array.prototype, 'rev', {
            enumerable: false,
            value: function(index){
              return this[this.length - 1 - index];
            }
          });
          
          document.write([1,2,3,4,5,6].rev(1));

          现在您可以反向使用基于零的索引。

          【讨论】:

            【解决方案9】:
            var a = [1,2,3,4];
            var b = a.slice(-2,-1);
            console.log(b);
            

            答案是[3]。你只需要提到切片的开始和结束。

            【讨论】:

              【解决方案10】:

              以下适用于具有第 n 个“url”部分的字符串。

              var fragment = '/t/e/s/t/i/n/g/';
              var fragment = '/t/';
              

              如果片段长度可变,您需要一种适用于各种片段大小的解决方案。

              var fragment = '/news/article-1/';
              var array_fragment = fragment.split('/');
              

              Split 将找到 '/' 的片段字符串分开。 Split 取分割字符前后的值。在这种情况下,第一个斜线之前或最后一个斜线之后没有任何内容。将空值添加到 array_fragment 的第一个和最后一个数组位置。

              jQuery
              var pg_url = $(array_fragment)[$(array_fragment).length - 2];
              
              javascript
              var pg_url = array_fragment[array_fragment.length - 2];
              

              如您所见,此解决方案不需要 jQuery。

              Array_fragment.length - 2 正在计算array_fragment 的长度,并选择倒数第二项。最后一个值为 "",因为 Split('/') 在 array_fragment 数组的末尾添加了一个空值。

              简化并放在一起:

              var f = '/t/e/s/t/i/n/g/'.split('/');
              f[f.length - 2]
              

              【讨论】:

                【解决方案11】:
                const myArray: Array<string> = ['first', 'second', 'third'];
                

                按倒数第二项拆分 myArray。

                const twoItemsFromEnd = myArray.slice(-2); //Outputs: ['second', 'third']
                

                然后

                const secondLast = twoItemsFromEnd[0];
                

                或者:

                const secondLast = (params.slice(-2))[0];
                

                【讨论】:

                • JJ Geewax's answer in here 已经涵盖了您的答案...它实际上更简单、更详细,因为它使用 slice 的第二个参数使数组只有倒数第二个元素而不声明其他变量(例如[1,2,3].slice(-2,-1)[0] === 2
                猜你喜欢
                • 1970-01-01
                • 2022-08-09
                • 1970-01-01
                • 2012-09-20
                • 2023-03-03
                • 2016-09-25
                • 2018-05-01
                • 2017-01-16
                • 2014-09-09
                相关资源
                最近更新 更多