【问题标题】:How to get the first element of an array?如何获取数组的第一个元素?
【发布时间】:2011-05-04 16:18:32
【问题描述】:

如何从这样的数组中获取第一个元素:

var ary = ['first', 'second', 'third', 'fourth', 'fifth'];

我试过了:

alert($(ary).first());

但它会返回[object Object]。所以我需要从数组中获取第一个元素,它应该是元素'first'

【问题讨论】:

  • 我强烈建议按active对答案进行排序

标签: javascript arrays


【解决方案1】:

喜欢这个

alert(ary[0])

【讨论】:

  • var a = []; a[7] = 'foo'; alert(a[0]);
  • 这假设数组中的第一个元素的索引始终为 0。你知道他们对假设的看法......
  • @Andy 没有假设,因为 OP 的问题非常明确和具体。
  • @Petah 该代码没有问题。它只是显示未定义,因为这是 a[0] 的值,它实际上是数组中的第一项。如果你想让它显示 foo 你应该跳过所有未定义的值,但它不会是数组中的第一项。
  • @MichielvanderBlonk 我只是指出了一些用户可能没有预料到的边缘情况。
【解决方案2】:

你为什么要对一个普通的 JavaScript 数组进行 jQuery 化?使用标准 JavaScript!

var ary = ['first', 'second', 'third', 'fourth', 'fifth'];
alert(ary[0]);

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array

另外,

Source,由bobince提供

【讨论】:

  • 请参阅this answer,了解为什么此解决方案并不总是有效。
  • 第一个链接坏了。应该换成developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…吗?
  • @Henke 是的。谢谢你的提示。随意建议将来对此类事情进行编辑! :)
  • 如果事先设置了数组键,它将不起作用。假设键总是从零开始是错误的。
【解决方案3】:

下面的一些方法适用于不同的情况。

在大多数正常情况下,访问第一个元素的最简单方法是通过

yourArray[0]

但这需要您检查 [0] 是否确实存在。

在现实世界的情况下,您不关心原始数组,也不想检查索引是否存在,您只想获取第一个元素或未定义的内联。

在这种情况下,您可以使用shift() 方法来获取第一个元素,但请注意此方法会修改原始数组(删除第一项并返回它)。因此,数组的长度减一。 此方法可用于只需要获取第一个元素但不关心原始数组的内联情况。

yourArray.shift()

要知道的重要一点是,如果您的数组以 [0] 索引开头,则上述两个只是一个选项。

在某些情况下,第一个元素已被删除,例如,删除 yourArray[0] 会使您的数组留下“洞”。现在 [0] 处的元素只是未定义的,但您想获得第一个“现有”元素。我见过很多这样的真实案例。

所以,假设我们不知道数组和第一个键(或者我们知道有洞),我们仍然可以得到第一个元素。

您可以使用find() 来获取第一个元素。

find() 的优势在于它的效率,因为它在满足条件的第一个值到达时退出循环(下面将详细介绍)。 (您也可以自定义条件以排除 null 或其他空值)

var firstItem = yourArray.find(x=>x!==undefined);

我还想在此处包含filter() 作为选项,以首先“修复”副本中的数组,然后在保持原始数组完整(未修改)的同时获取第一个元素。

在此处包含 filter() 的另一个原因是它在 find() 之前就已经存在,并且许多程序员已经在使用它(它是 ES5,而 find() 是 ES6)。

var firstItem = yourArray.filter(x => typeof x!==undefined).shift();

警告 filter() 并不是真正有效的方法(filter() 遍历所有元素)并创建另一个数组。可以在小型数组上使用,因为性能影响很小,例如,更接近于使用 forEach。

(我看到有些人建议使用 for...in 循环来获取第一个元素,但我建议不要使用这种方法for...in should not be used to iterate over an Array where the index order is important,因为它不能保证顺序,尽管您可以争辩浏览器大多尊重顺序。顺便说一句,forEach 并没有像许多人建议的那样解决问题,因为你不能打破它,它会贯穿所有元素。你最好使用一个简单的 for 循环并检查键/值

find() 和 filter() 都保证元素的顺序,因此可以安全地使用上面的方法。

【讨论】:

  • 为什么不在之后取消移动数组,例如: var element = yourArray.shift(); yourArray.unshift(element);
  • 因为它是非常低效和坏事。您可以以非常有效的方式获得第一个元素。 shift 和 unshift 都进行一些检查并遍历整个数组以完成任务,因为当您在开头删除或添加新元素时,所有其他索引都应该移动。就像你有一辆挤满了人的公共汽车,当后座有人要下车时,你从前门把公共汽车倒空,然后再让他们上车。
  • @Selay 取决于解释器的具体内部结构。
  • @Michiel van der Blonk 你能告诉我你提到的哪个口译员。我很感兴趣。我知道的所有实现都使用循环和复制。这就是 JavaScript 数组的工作方式。您不能简单地删除第一个元素,因为剩余的数组现在从 1 开始(删除了位置 0 的元素),您需要修复它。无论你有什么内部实现,你都无法创造奇迹。
  • 如果您使用yourArray.map(n=>n).shift(),它将返回第一项而不修改原始项...不知道这是否是最好的方法,但如果您使用 .map().filter( ).some().shift() 没关系.. 否则我会使用yourArray[0]
【解决方案4】:

使用 ES6 解构

let [first] = [1,2,3];

与此相同

let first = [1,2,3][0];

【讨论】:

  • 如果您的数组以 [0] 索引开头,则可能需要添加 Destructing 选项。
  • @leonheess 所有 JavaScript 数组都从 [0] 索引开始。
  • @Jonathan 这取决于你如何定义开始。我可以创建一个像这样[,'a','b','c'] 的数组。我认为它从索引 1 开始。
  • @leonheess 我猜?对我来说,该数组仍然从 0 开始,但您插入了一个 undefined 值。 ?‍♂️
  • @ChristianBonato 我认为您误读了我或误读了我的 cmets。我同意你的看法。引用的文字来自乔纳森的评论?顺便说一句:使用my solution,无论您的数组从哪里开始,您都会获得第一个元素。
【解决方案5】:

你可以使用find():

const first = array.find(Boolean)

或者如果你想要第一个元素即使如果它是falsy:

const first = array.find(e => true)

加倍努力:

如果您关心可读性但又不想依赖数字发生率,您可以通过使用Object​.define​Property() 定义它来添加first() 函数到Array.prototype,这可以减轻修改内置数组对象的缺陷直接原型 (explained here)。

性能非常好(find() 在第一个元素之后停止)但它并不完美或普遍可访问(仅限 ES6)。更多背景信息请阅读@Selays answer

Object.defineProperty(Array.prototype, 'first', {
  value() {
    return this.find(e => true)     // or this.find(Boolean)
  }
})

要检索第一个元素,您现在可以这样做:

const array = ['a', 'b', 'c']
array.first()

> 'a'

片段以查看它的实际效果:

Object.defineProperty(Array.prototype, 'first', {
  value() {
    return this.find(Boolean)
  }
})

console.log( ['a', 'b', 'c'].first() )

【讨论】:

  • 这是最好和最新的答案。我正要在这里发布同样的内容,但在我看到你的之后:)
  • 如果在未来的语言版本中添加 find() 会发生什么? :-) 上面的 sn-p 不会破坏它吗?
  • @Bogdan 你是什么意思他们什么时候会添加find()find() 长期以来一直是语言的一部分。这就是上述 sn-p 起作用的原因。
  • 哦。抱歉有点累没睡多少我首先指的是。
  • @Bogdan 它仍然可以正常工作,但会覆盖语言的潜在未来first()-method
【解决方案6】:

如果第一个元素已被删除,则索引为 0 的元素可能不存在:

let a = ['a', 'b', 'c'];
delete a[0];

for (let i in a) {
  console.log(i + ' ' + a[i]);
}

不使用 jQuery 获取第一个元素的更好方法:

function first(p) {
  for (let i in p) return p[i];
}

console.log( first(['a', 'b', 'c']) );

【讨论】:

  • a.entries()[0] 应该这样做:)
  • 那是因为您不应该将这种用于枚举的数组用于枚举,因为它枚举的是对象而不是数组成员。将索引与传统的 for 循环一起使用。
  • 类似的 ES6 方法(也不依赖数字索引):stackoverflow.com/a/56115413/7910454
【解决方案7】:

如果您想保留可读性,您可以随时将第一个函数添加到Array.protoype

Array.prototype.first = function () {
    return this[0];
};

然后你可以很容易地检索到第一个元素:

[1, 2, 3].first();
> 1

【讨论】:

  • 出于充分的理由以任何方式修改基类的原型被认为是一种非常糟糕的做法。
  • 太傻了,输入.first() 比输入[0] 更好吗?
  • @jonschlinkert 有些语言的索引以1 开头。 first 在这种情况下是明确的。
  • [].first() 返回什么?
  • 这是有缺陷的! 您将函数添加为可枚举属性,这意味着它将显示为每个 for ... in 循环中每个数组的元素之一( !)。 Instead use Object.defineProperty()
【解决方案8】:

如果您的数组不能保证从索引零开始填充,您可以使用Array.prototype.find()

var elements = []
elements[1] = 'foo'
elements[2] = 'bar'

var first = function(element) { return !!element }    
var gotcha = elements.find(first)

console.log(a[0]) // undefined
console.log(gotcha) // 'foo'

【讨论】:

【解决方案9】:
array.find(e => !!e);  // return the first element 

因为“查找”返回第一个匹配过滤器的元素 && !!e 匹配任何元素。

注意这仅在第一个元素不是“Falsy”时有效:nullfalseNaN""0undefined p>

【讨论】:

  • Abdennour 向其他人澄清您的条件匹配任何真实元素,即 const example = [null, NaN, 0, undefined, {}, 3, 'a']; const firstTruthyElement = example.find(e => !!e); // 分配第 5 个元素,第一个非 falsy:{}
  • 感谢@PDA 赶上来。顺便说一句,空字符串也被认为是虚假的
  • 这很棒,在 TypeScript 中也很有效。简化为array.find(() => true); 怎么样?这也允许您执行[false].find(() => true)
  • @SimonWarta 当然.find(value => true) 只是按预期工作......但老实说,如果你想要更简洁的代码并保持打字稿中的打字,请使用destructuring
  • 请参阅this answer 以了解类似的方法,而不会忽略错误元素的陷阱
【解决方案10】:

在ES2015及以上,使用数组解构:

const arr = [42, 555, 666, 777]
const [first] = arr
console.log(first)

【讨论】:

【解决方案11】:

只有在您使用 underscore.js (http://underscorejs.org/) 的情况下,您才能这样做:

_.first(your_array);

【讨论】:

    【解决方案12】:

    我知道那些从其他语言转向 JavaScript 的人,正在寻找像 head()first() 这样的东西来获取数组的第一个元素,但你怎么能做到呢?

    假设你有下面的数组:

    const arr = [1, 2, 3, 4, 5];
    

    在 JavaScript 中,您可以这样做:

    const first = arr[0];
    

    或者更简洁、更新的方式是:

    const [first] = arr;
    

    但你也可以简单地写一个函数,比如...

    function first(arr) {
       if(!Array.isArray(arr)) return;
       return arr[0];
    }
    

    如果使用下划线,则有一系列功能与您正在寻找的功能相同:

    _.first 
    
    _.head
    
    _.take
    

    【讨论】:

      【解决方案13】:

      试试alert(ary[0]);

      【讨论】:

      • 请参阅this answer,了解为什么此解决方案并不总是有效。
      【解决方案14】:

      适用于数组的方法,它也适用于对象(请注意,对象没有保证顺序!)。

      我最喜欢这种方法,因为原始数组没有被修改。

      // In case of array
      var arr = [];
      arr[3] = 'first';
      arr[7] = 'last';
      var firstElement;
      for(var i in arr){
          firstElement = arr[i];
          break;
      }
      console.log(firstElement);  // "first"
      
      // In case of object
      var obj = {
          first: 'first',
          last: 'last',
      };
      
      var firstElement;
      
      for(var i in obj){
          firstElement = obj[i];
          break;
      }
      
      console.log(firstElement) // First;
      

      【讨论】:

        【解决方案15】:

        另一个只关注真实元素的人

        ary.find(Boolean);
        

        【讨论】:

          【解决方案16】:

          使用过滤器查找数组中的第一个元素:

          在打字稿中:

          function first<T>(arr: T[], filter: (v: T) => boolean): T {
              let result: T;
              return arr.some(v => { result = v; return filter(v); }) ? result : undefined;
          }
          

          在纯javascript中:

          function first(arr, filter) {
              var result;
              return arr.some(function (v) { result = v; return filter(v); }) ? result : undefined;
          }
          

          同样,indexOf:

          在打字稿中:

          function indexOf<T>(arr: T[], filter: (v: T) => boolean): number {
              let result: number;
              return arr.some((v, i) => { result = i; return filter(v); }) ? result : undefined;
          }
          

          在纯javascript中:

          function indexOf(arr, filter) {
              var result;
              return arr.some(function (v, i) { result = i; return filter(v); }) ? result : undefined;
          }
          

          【讨论】:

            【解决方案17】:

            ES6 扩展运算符 + .shift() 解决方案

            使用myArray.shift()可以得到数组的第一个元素,但是.shift()会修改原始数组,所以为了避免这种情况,首先可以使用[...myArray]创建数组的副本,然后应用@ 987654324@此副本:

            var myArray = ['first', 'second', 'third', 'fourth', 'fifth'];
            
            var first = [...myArray].shift();        
            
            console.log(first);

            【讨论】:

              【解决方案18】:

              只需使用ary.slice(0,1).pop();

              var ary = ['first', 'second', 'third', 'fourth', 'fifth'];
              
              console.log("1º "+ary.slice(0,1).pop());
              console.log("2º "+ary.slice(0,2).pop());
              console.log("3º "+ary.slice(0,3).pop());
              console.log("4º "+ary.slice(0,4).pop());
              console.log("5º "+ary.slice(0,5).pop());
              console.log("Last "+ary.slice(-1).pop());

              array.slice(START,END).pop();

              【讨论】:

              • 为什么是这个而不是ary[0]
              • @nathanfranke 因为这个问题非常通用“如何获取数组的第一个元素?”并且已经有几个使用ary[0] 的高度赞成的答案,所以如果按照您的建议回答,这将是重复的。使用 slice/pop 也使得抓取最后一个元素变得微不足道,即const last = ary.slice(-1).pop()
              • 有没有一个例子说明如何复制数组和pop-ing 在某种程度上更好地获取数组的第一个元素?
              【解决方案19】:

              当有多个匹配项时,JQuery 的 .first() 用于获取与给定给 jquery 的 css 选择器匹配的第一个 DOM 元素。

              您不需要 jQuery 来操作 javascript 数组。

              【讨论】:

                【解决方案20】:

                为什么不考虑数组可能为空的次数?

                var ary = ['first', 'second', 'third', 'fourth', 'fifth'];
                first = (array) => array.length ? array[0] : 'no items';
                first(ary)
                // output: first
                
                var ary = [];
                first(ary)
                // output: no items
                

                【讨论】:

                  【解决方案21】:

                  你也可以使用 .get(0):

                  alert($(ary).first().get(0));
                  

                  获取数组的第一个元素。

                  【讨论】:

                  • 您的解决方案需要 jQuery
                  【解决方案22】:

                  声明一个原型以获取第一个数组元素为:

                  Array.prototype.first = function () {
                     return this[0];
                  };
                  

                  然后将其用作:

                  var array = [0, 1, 2, 3];
                  var first = array.first();
                  var _first = [0, 1, 2, 3].first();
                  

                  或者简单地说(:

                  first = array[0];
                  

                  【讨论】:

                    【解决方案23】:

                    var ary = ['first', 'second', 'third', 'fourth', 'fifth'];
                    alert(Object.values(ary)[0]);

                    【讨论】:

                    • 这是 vanilla JS,没有 jQuery,没有库,什么都没有.. :P.. 如果数组索引不从零开始,它将起作用,如果世界还没有结束,它将起作用。 ...
                    【解决方案24】:

                    我更喜欢使用数组解构

                    const [first, second, third] = ["Laide", "Gabriel", "Jets"];
                    console.log(first);  // Output: Laide
                    console.log(second); // Output: Gabriel
                    console.log(third);  // Output: Jets
                    

                    【讨论】:

                      【解决方案25】:

                      如果您将视图函数链接到数组,例如

                      array.map(i =&gt; i+1).filter(i =&gt; i &gt; 3)

                      想要在这些函数之后的第一个元素,你可以简单地添加一个.shift(),它不会修改原来的array,它比array.map(i =&gt; i+1).filter(=&gt; i &gt; 3)[0]更好的方式

                      如果您想要数组的第一个元素而不修改原始元素,您可以使用array[0]array.map(n=&gt;n).shift()(没有地图,您将修改原始元素。在这种情况下,顺便说一句,我建议使用..[0] 版本。

                      【讨论】:

                      • 正是我正在研究的用例。工作。
                      【解决方案26】:

                      当数组索引从零开始时,前面的示例运行良好。 thomax's answer 不依赖从零开始的索引,而是依赖于我无法访问的Array.prototype.find。以下使用jQuery $.each 的解决方案在我的情况下效果很好。

                      let haystack = {100: 'first', 150: 'second'},
                          found = null;
                      
                      $.each(haystack, function( index, value ) {
                          found = value;  // Save the first array element for later.
                          return false;  // Immediately stop the $.each loop after the first array element.
                      });
                      
                      console.log(found); // Prints 'first'.
                      

                      【讨论】:

                        【解决方案27】:

                        您可以通过 lodash _.head 轻松完成。

                        var arr = ['first', 'second', 'third', 'fourth', 'fifth'];
                        console.log(_.head(arr));
                        &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"&gt;&lt;/script&gt;

                        【讨论】:

                        • 它确实是 arr[0],正如你所看到的 here 这就是为什么我强烈不鼓励使用像 lodash 这样的大型库来完成这么小的任务。
                        【解决方案28】:

                        @NicoLwk 您应该使用拼接删除元素,这会将您的数组移回。所以:

                        var a=['a','b','c'];
                        a.splice(0,1);
                        for(var i in a){console.log(i+' '+a[i]);}
                        

                        【讨论】:

                        • 这个答案是对上面(NicoLwks)答案的评论,应该删除
                        【解决方案29】:

                        使用它来分割 javascript 中的字符。

                        var str = "boy, girl, dog, cat";
                        var arr = str.split(",");
                        var fst = arr.splice(0,1).join("");
                        var rest = arr.join(",");
                        

                        【讨论】:

                          【解决方案30】:
                          var ary = ['first', 'second', 'third', 'fourth', 'fifth'];
                          
                          console.log(Object.keys(ary)[0]);
                          

                          创建任何 Object 数组 (req),然后只需执行 Object.keys(req)[0] 即可选择 Object 数组中的第一个键。

                          【讨论】:

                          • 虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
                          猜你喜欢
                          • 2012-06-05
                          • 2010-12-27
                          • 2019-06-01
                          • 2016-07-07
                          • 1970-01-01
                          • 2015-11-22
                          • 1970-01-01
                          • 2012-08-21
                          相关资源
                          最近更新 更多