如何从数组中获取前 N 个元素

IT技术 javascript arrays filtering slice extract
2021-01-18 18:35:30

我正在使用 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} />);
    });

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

你能帮忙吗?

6个回答

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

const slicedArray = array.slice(0, n);
@Morgoth - 我在这里很困惑 - 你是说这是不正确的,因为在数组少于 3 个元素的情况下,此方法不会返回 3 个元素?
2021-03-15 18:35:30
请注意,slice数组上的函数返回数组的浅表副本,并且不会修改原始数组。developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
2021-04-02 18:35:30
我回应@Rishabh876 另一个升级的答案是不正确的,以后可能很难调试。
2021-04-03 18:35:30
如果 n 大于 size 会抛出任何错误吗?
2021-04-10 18:35:30
@ Rishabh876 不,不是。因为array.slice(0, n);它返回[0, min(n, array.length))
2021-04-10 18:35:30

我相信你正在寻找的是:

// ...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>   
)
arr.length = n

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

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

清空数组

arr.length = 0
如果数组小于 N,这也将扩展数组
2021-03-13 18:35:30
@Ynot 好的,我会让它更明显一点
2021-03-17 18:35:30
你确定这比 快arr = []吗?
2021-03-23 18:35:30
值得一提的是,这将改变数组,其中 slice 将返回一个浅拷贝。如果您需要使用您刚刚永久截断的项目,这将成为一个很大的不同。
2021-04-03 18:35:30
这里的好处是避免了内存分配。在运行时初始化新对象,即游戏会触发垃圾收集器和卡顿。
2021-04-07 18:35:30

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

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

.filter它本身并不是一个很好的选择,至少在输入数组可能很长的情况下不是。.filter遍历数组的每个元素检查其条件。.slice不会这样做,而只会提取前 n 个元素,然后停止处理 - 这绝对是您想要的长列表。(正如@elQueFaltaba 在对另一个答案的评论中所说的那样。)
2021-03-12 18:35:30

不要尝试使用 map 函数来执行此操作。Map 函数应该用于将值从一件事映射到另一件事。当输入和输出的数量匹配时。

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

var items = list
             .filter((i, index) => (index < 3))
             .map((i, index) => {
                   return (
                     <myview item={i} key={i.id} />
                   );
              });
filter 函数会遍历数组中的所有元素,而 slice 不会,所以使用 slice 在性能上会更好,对吧?
2021-04-01 18:35:30
您总体上是正确的,但从语义上讲,您应该使用过滤器首先过滤元素集,然后,如果您采用这种方法,则映射过滤后的集合。
2021-04-11 18:35:30