如何在 Javascript/jQuery 中动态切片数组?

Posted

技术标签:

【中文标题】如何在 Javascript/jQuery 中动态切片数组?【英文标题】:How can you dynamically slice an array in Javascript/jQuery? 【发布时间】:2017-09-03 10:24:18 【问题描述】:

我有一个照片库,其中包含将不断上传的图像。 php 数组已被转换/编码为 JSON 数组,以便我可以使用 javascript 操作数据。

理想情况下,我想单击一个按钮(CodePen 示例中的“下一组”)并加载下一组(2 个)缩略图。这是为了不一次加载所有图像,这可能是数百个。

问题:我无法弄清楚如何在点击时动态对数组进行切片(接下来的 5 张图片)。我当然可以一次加载 2 个:

myArray.slice(0,2);
myArray.slice(3,5);

但是,这不起作用,因为图像会不断添加到图库中。此外,我必须有太多的上述设置才能一次切出 5 个。

我试过了:

将数组拆分成更小的数组 for 循环和$.each 循环

我基本上需要能够在单击时将切片的开始和结束索引移动(例如)2。现在它只是继续对相同的两个图像进行切片,因为切片不是动态的。

这是我的CodePen

【问题讨论】:

只需在全局变量中跟踪索引,每次点击增加 5。然后.slice(index, index + 5); index += 5; 或者,如果您不关心原始数组(如果您不关心它是否被 sgrunk),您可以使用 splice 从数组中删除项目!每次调用.splice(0, 2) 都会得到不同的元素,因为之前的元素已经从原始数组中删除了! 请记住,在这种情况下,splice 应始终以 0 (.splice(0, amount)) 开头! .shift 从数组的开头只剪切一项,要使用它,您需要一个循环来剪切任意数量的元素!使用.splice(0, amount) 将从一开始就削减amount 的项目,因此不需要循环! 如果您需要遍历 spliceing 的结果数组,请使用 shift如果您要将返回数组作为一个整体使用,请使用.splice。值得一提的是splice 更安全,因为([1, 2].splice(0, 10000) === [1, 2]),在shift 版本中,您必须检查数组中是否还有元素以查看是否继续(否则返回未定义)! 加上splice,您可以像这样使用forEacharray.splice(0, amount).forEach(function(img) /* use img here */);push 性能稍好! 【参考方案1】:

我认为你的问题很简单。你做一个切片,总是得到相同的数组

var array = [0,1,2,3,4,5];
let newArray1 = array.slice(0,2); // returns a new array
let newArray2 = array.slice(0,2); // returns the same new array

for(var i = 0; i < 2; i = i+2) 
  result = array.slice(i, i+2);
  console.log(result);

【讨论】:

【参考方案2】:

我认为没有办法完全按照您的意愿行事,但您可以跟踪您在数组中的位置并从那里进行切片,如下所示:

var nextSet = myArray.slice(lastIndex, lastIndex + 2);

用这个替换你现有的click()(包括lastIndex的声明)来试试:

var lastIndex = 0
$('.button').click(function() 
  var nextSet = myArray.slice(lastIndex, lastIndex + 2);
  lastIndex += 2;
  for (var i = 0; i < 2; i++) 
    var li = $('<li/>').attr('role', 'menuitem').appendTo('.myList').append('<img src=' + nextSet[i] + '>');
  
);

请注意,我已将 slice() 行移到 for 循环之外。无需为每次迭代都分割一个新数组。

这是CodePen using .slice()

另一种方法是使用 shift() 在每次迭代时剥离数组中的第一项:

var nextItem = myArray.shift()

虽然这是破坏性的(它会从原始数组中删除项目),因此如果您想将其用于其他任何事情,您需要先复制原始数组。将您的 click() 替换为:

$('.button').click(function() 
  for (var i = 0; i < 2; i++) 
    var nextItem = myArray.shift();
    var li = $('<li/>').attr('role', 'menuitem').appendTo('.myList').append('<img src=' + nextItem + '>');
  
);

这是CodePen using .shift()

【讨论】:

谢谢! .shift() 方法似乎正是我想要的!再次,非常感谢你。已经为此工作了很长时间。你摇滚!

以上是关于如何在 Javascript/jQuery 中动态切片数组?的主要内容,如果未能解决你的问题,请参考以下文章

使用 javascript/jquery 动态创建 div

如何使用javascript验证动态生成的输入框值

使用 javascript/jquery 动态调整画布窗口的大小?

在javascript或jQuery中检测iframe的负载(不是同一个域,动态添加)?

在javascript、jquery或vue中制作动态条件[关闭]

在 Javascript/JQuery 中选择单选选项时,是不是可以动态更改下拉列表的颜色或更改列表项的颜色?