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

use*_*912 297 javascript reactjs

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

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

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

然后获得我尝试的前3项

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

这不起作用,因为地图没有设定功能.

你能帮忙吗?

Ori*_*iol 475

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

array.slice(0, n);
Run Code Online (Sandbox Code Playgroud)

  • 请注意,数组上的`slice`函数返回数组的浅表副本,而不会修改原始数组.https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/slice (31认同)
  • @Rishabh876 不,不是。对于“array.slice(0, n);”,它返回“[0, min(n, array.length))”。 (13认同)
  • 如果 n 大于 size ,这会引发任何错误吗? (9认同)
  • @ashleedawg 取决于你对正确的定义。如果“array”的元素少于 3 个,并且将其切片为 3 个,那么它将返回数组中的所有元素(即少于 3 个)。这是一个非常明智的行为,但如果这对您的应用程序没有意义,您可能需要首先检查数组的长度。 (5认同)
  • @Morgoth - 我在这里很困惑 - 你是说这是不正确的,因为在数组少于 3 个元素的情况下,这个方法不会返回 3 个元素? (2认同)

小智 319

我相信你要找的是:

// ...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>   
)
Run Code Online (Sandbox Code Playgroud)

  • 当人们保持简单时的爱:)谢谢 (2认同)

小智 51

使用切片方法

javascriptslice()方法将数组的一部分返回到从头到尾选择的新数组对象中,其中 start 和 end 表示该数组中项目的索引。原始数组不会被修改。

句法 :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)
Run Code Online (Sandbox Code Playgroud)


Paw*_*wel 21

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

如果不再需要当前阵列,你不关心不变性或者不想分配内存,即对于游戏来说最快的方法是

arr.length = n
Run Code Online (Sandbox Code Playgroud)

清空一个数组

arr.length = 0
Run Code Online (Sandbox Code Playgroud)

  • 如果数组小于 N,这也会扩展数组 (11认同)
  • 这样做的好处是避免了内存分配。在运行时初始化新对象(即游戏)会触发垃圾收集器和垃圾。 (3认同)
  • 值得一提的是,这将改变数组,其中 slice 将返回一个浅拷贝。如果您需要使用刚刚永久截断的项目,这将变得非常不同。 (2认同)
  • @Ynot 好的,我会让它更明显一点 (2认同)

Anu*_*pta 15

只需尝试从列表中获取第一个n元素:

const slicedList = list.slice(0, n);
Run Code Online (Sandbox Code Playgroud)

例子:

const slicedList = list.slice(0, n);
Run Code Online (Sandbox Code Playgroud)


小智 14

[1,2,3,4,5,6,7,8,8].slice(0, 3) = While 返回前 3 个元素。

答案:[1,2,3]

怎么运行的

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


san*_*eep 11

不要尝试使用地图功能.应使用Map函数将值从一个事物映射到另一个事物.当输入和输出的数量匹配时.

在这种情况下,使用过滤器功能,该功能也可在阵列上使用.当您想要选择性地获取加工某些标准的值时,使用过滤器功能.然后你可以编写你的代码

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

  • 过滤器函数将遍历数组中的所有元素,而切片不会,因此使用切片的性能更好,对吧? (4认同)

Fre*_*ddy 9

您可以使用index数组过滤。

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

  • `.filter` 本身并不是一个很好的选择,至少在输入数组可能很长的情况下不是这样。`.filter` 遍历数组的每个元素检查其条件。`.slice` 不会执行此操作,而只会提取前 n 个元素,然后停止处理 - 这绝对是您想要的长列表。(正如 @elQueFaltaba 在另一个答案的评论中已经说过的那样。) (10认同)

far*_*k13 7

使用一个简单的例子:

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

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

var letters_12 = letters.slice(1, 2);
console.log(letters_12)
Run Code Online (Sandbox Code Playgroud)

输出:["b"]

注意:slice仅提供拷贝,修改原始数组。


nur*_*tey 6

随着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);
// => []
Run Code Online (Sandbox Code Playgroud)


小智 5

以下对我有用。

array.slice( where_to_start_deleting, array.length )
Run Code Online (Sandbox Code Playgroud)

这是一个例子

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

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