【问题标题】:How to get first N number of elements from an array如何从数组中获取前N个元素
【发布时间】:2016-04-25 07:07:35
【问题描述】:

我正在使用 Javascript(ES6) /FaceBook react 并尝试获取大小不同的数组的前 3 个元素。我想做相当于 Linq take(n)。

在我的 Jsx 文件中,我有以下内容:

var items = list.map(i => {
  return (
    <myview item={i} key={i.id} />
  );
});

然后得到我尝试的前 3 个项目

  var map = new Map(list);
    map.size = 3;
    var items = map(i => {
      return (<SpotlightLandingGlobalInboxItem item={i} key={i.id} />);
    });

这不起作用,因为地图没有设置功能。

你能帮忙吗?

【问题讨论】:

    标签: javascript arrays filtering slice extract


    【解决方案1】:

    要获取数组的第一个 n 元素,请使用

    const slicedArray = array.slice(0, n);
    

    【讨论】:

    • 请注意,数组上的slice 函数会返回数组的浅拷贝,并且不会修改原始数组。 developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
    • 如果 n 大于 size 会抛出任何错误吗?
    • @Rishabh876 不,它没有。对于array.slice(0, n);,它返回[0, min(n, array.length))
    • 我回显@Rishabh876 另一个升级的答案是不正确的,以后可能很难调试。
    • @Morgoth - 我在这里很困惑 - 你是说这是不正确的,因为如果数组的元素少于 3 个,此方法不会返回 3 个元素?
    【解决方案2】:

    我相信您正在寻找的是:

    // ...inside the render() function
    
    var size = 3;
    var items = list.slice(0, size).map(i => {
        return <myview item={i} key={i.id} />
    });                       
    return (
      <div>
        {items}
      </div>   
    )
    

    【讨论】:

      【解决方案3】:
      arr.length = n
      

      这可能令人惊讶,但数组的length 属性不仅用于获取数组元素的数量,而且它也是可写的,并且可用于设置数组的长度MDN link。这将改变数组。

      如果您不关心不变性或不想分配内存,即对于游戏,这将是最快的方式。

      清空数组

      arr.length = 0
      

      【讨论】:

      • 你确定这比arr = [] 快吗?
      • 这里的好处是避免了内存分配。在运行时初始化新对象,即游戏会触发垃圾收集器和卡顿。
      • 值得一提的是,这将改变数组,其中 slice 将返回浅拷贝。如果您需要使用刚刚永久截断的项目,这将产生很大的不同。
      • @Ynot ok,我会让它更明显一点
      • 如果数组小于N,这也会扩展数组
      【解决方案4】:

      您可以使用数组的index 进行过滤。

      var months = ['Jan', 'March', 'April', 'June'];
      months = months.filter((month,idx) => idx < 2)
      console.log(months);

      【讨论】:

      • .filter 本身并不是一个好选择,至少在输入数组可能很长的情况下不是。 .filter 遍历数组的每个元素,检查其条件。 .slice 不会这样做,只会提取前 n 个元素,然后停止处理——这绝对是你想要的长列表。 (正如@elQueFaltaba 已经在 cmets 中对另一个答案所说的那样。)
      【解决方案5】:

      不要尝试使用地图功能。映射函数应该用于将值从一件事映射到另一件事。当输入输出数量匹配时。

      在这种情况下,请使用阵列上也可用的过滤器功能。当您想要有选择地获取符合特定条件的值时,使用过滤器功能。然后你可以写你的代码像

      var items = list
                   .filter((i, index) => (index < 3))
                   .map((i, index) => {
                         return (
                           <myview item={i} key={i.id} />
                         );
                    });
      

      【讨论】:

      • 您总体上是正确的,但从语义上讲,您应该使用过滤器首先过滤一组元素,然后,如果您采用这种方法,则映射过滤后的一组。
      • 过滤器函数会遍历数组中的所有元素,而切片则不会,所以使用切片在性能方面会更好,对吧?
      【解决方案6】:

      使用切片法

      javascript slice() 方法将数组的一部分返回到从开始到结束选择的新数组对象中,其中开始和结束表示该数组中项目的索引。原数组不会被修改。

      语法:slice(start, end)

      假设我们有一个包含 7 个项目 [5,10,15,20,25,30,35] 的数组,我们想要该数组的前 5 个元素:

      let array = [5,10,15,20,25,30,35]
      let newArray = array.slice(0,5)
      
      console.log(newArray)
      

      【讨论】:

        【解决方案7】:

        以下内容对我有用。

        array.slice( where_to_start_deleting, array.length )
        

        这是一个例子

        var fruits = ["Banana", "Orange", "Apple", "Mango"];
        fruits.slice(2, fruits.length);
        //Banana,Orange  ->These first two we get as resultant
        

        【讨论】:

        • 在第一个示例中您使用slice,但在第二个示例中您使用splice
        • 这也是错误的。你会从这里得到["Apple", "Mango"]。切片的第一部分不是“从哪里开始删除”,而是从哪里开始切片。它不会修改原始数组,也不会删除任何内容。
        • 这是不正确的。 Slice 返回切片项的新数组。应该是fruits.slice(0,2),其中0 是起始索引,2 是要取的数字。 developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
        【解决方案8】:

        试试这个从列表中获取第一个 n 元素:

        const slicedList = list.slice(0, n);
        

        示例:

        const list = [1,2,3,4,5]
        console.log(list.slice(0, 3)) // Should return [1,2,3] 
        console.log(list.slice(0, 10)) // Returns [1,2,3,4,5] since this is all we have in 1st 10 elements

        【讨论】:

          【解决方案9】:

          用一个简单的例子:

          var letters = ["a", "b", "c", "d"];
          var letters_02 = letters.slice(0, 2);
          console.log(letters_02)
          

          输出:["a", "b"]

          var letters_12 = letters.slice(1, 2);
          console.log(letters_12)
          

          输出:["b"]

          注意:slice 仅提供浅层副本,修改原始数组。

          【讨论】:

            【解决方案10】:

            使用lodashtake函数,您可以通过以下方式实现:

            _.take([1, 2, 3]);
            // => [1]
             
            _.take([1, 2, 3], 2);
            // => [1, 2]
             
            _.take([1, 2, 3], 5);
            // => [1, 2, 3]
             
            _.take([1, 2, 3], 0);
            // => []
            

            【讨论】:

              【解决方案11】:

              slice() 方法将数组的一部分的浅拷贝返回到从开始到结束(不包括结束)选择的新数组对象中,其中开始和结束表示该数组中项目的索引。原数组不会被修改。

              const animals = ['ant', 'bison', 'camel', 'duck', 'elephant'];
              
              console.log(animals.slice(2));
              // expected output: Array ["camel", "duck", "elephant"]
              
              console.log(animals.slice(2, 4));
              // expected output: Array ["camel", "duck"]
              
              console.log(animals.slice(1, 5));
              // expected output: Array ["bison", "camel", "duck", "elephant"]
              
              console.log(animals.slice(-2));
              // expected output: Array ["duck", "elephant"]
              
              console.log(animals.slice(2, -1));
              // expected output: Array ["camel", "duck"]
              

              know more

              【讨论】:

                【解决方案12】:

                使用LInQer,您可以:

                Enumerable.from(list).take(3).toArray();
                

                【讨论】:

                  【解决方案13】:

                  Pawel 的回答似乎是资源关键型环境中的最佳选择,并且可以丢弃剩余的元素。

                  考虑到数组已经更小的情况,这是一个小小的改进:

                  if (arr.length &gt; n) arr.length = n

                  【讨论】:

                    【解决方案14】:

                    虽然这个问题很老了,但到2021年,已经有了用ECMAScript(javascript)最新特性编写的LINQ to object的完整实现。

                    Github 仓库是:https://github.com/IlanAmoyal/WebPartyLinq

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 2011-04-12
                      • 2020-03-01
                      • 2014-09-17
                      • 2012-06-21
                      • 2012-02-16
                      • 1970-01-01
                      • 2014-07-23
                      相关资源
                      最近更新 更多