JavaScript:如何将数组中的数据推送到子数组中,每16个项目都有一个数组[重复]

Posted

技术标签:

【中文标题】JavaScript:如何将数组中的数据推送到子数组中,每16个项目都有一个数组[重复]【英文标题】:JavaScript: How to push data in array, into subarrays with an array for each 16 items [duplicate] 【发布时间】:2015-07-03 15:19:36 【问题描述】:

我有一个示例数据集。我想将这些数据推送到一个数组中,每 16 条数据都有一个子数组。我开始了,但卡住了。有什么想法吗?

[ [16 names], [16 names ], [16 names] ]; // This is the output I want.

var data = ["Michael", "Marc", "John", "David", "Nick", "Mom", "Al", "Marlana", "Max", 
            "Scooter", "Pat", "George", "Lynne", "Tatyana", "Kim", "Kerry", "Enza", "Matt",
            "Liz", "Linda", "Ryan",
            "Ed", "Frank", "Christine", "Bill", "Jack", "Jill", "Joe", "Harry", "Red",
            "Fred", "Iggy", "Brian", "Bob", "Paul", "Gil", "Damian", "Kip", "Phil", "Curtis", "Aly",
           "Richard", "Robin", "Grant", "Ian", "Raptor", "T-Rex", "Stegosaurux", "Triceratops", "Compy"]


var sixteengroup = [];

for (var i = 0; i < data.length; i++)
  if (i % 16 == 0) sixteengroup.push([i])



console.log(sixteengroup);

【问题讨论】:

你有什么问题? 您是要将前 16 个放入一个数组中,接下来的 16 个放入另一个数组中,等等,还是要将第 1、17、33、第 1、2、18、34在第二个等等? 【参考方案1】:

尝试以下方法:

function split(a, n) 
    var len = a.length,out = [], i = 0;
    while (i < len) 
        var size = Math.ceil((len - i) / n--);
        out.push(a.slice(i, i += size));
    
    return out;

var data = ["Michael", "Marc", "John", "David", "Nick", "Mom", "Al", "Marlana", "Max", 
            "Scooter", "Pat", "George", "Lynne", "Tatyana", "Kim", "Kerry", "Enza", "Matt",
            "Liz", "Linda", "Ryan",
            "Ed", "Frank", "Christine", "Bill", "Jack", "Jill", "Joe", "Harry", "Red",
            "Fred", "Iggy", "Brian", "Bob", "Paul", "Gil", "Damian", "Kip", "Phil", "Curtis", "Aly",
           "Richard", "Robin", "Grant", "Ian", "Raptor", "T-Rex", "Stegosaurux", "Triceratops", "Compy"]

sixteengroup = split(data, data.length/16);
document.write(JSON.stringify(sixteengroup));

【讨论】:

要重新发明 slice 需要很多代码【参考方案2】:

我使用此功能按任意数字分组

  groupBy = function (array,howmany)
    
    var newarray =[];
    index=0;
    for(a=0;a<array.length;a++)
       if(a%howmany==0)
          if(a!=0)
           index++;               
          newarray[index]=[];
          newarray[index].push(array[a]);

      else
         newarray[index].push(array[a]);

      
   
  return newarray;


 items=groupBy(data,16);

【讨论】:

你可以稍微简化一下这个逻辑。 @Mathletics 我真的需要,似乎我仍然不擅长制作算法.. 好吧0 % n // 0 所以你不需要a==0 检查。 ohkie,谢谢我正在编辑。一个断章取义的问题,是缺乏使这些东西正确的经验、智商还是知识? @数学【参考方案3】:

拼接(破坏性)或切片听起来是个好主意

var data = ["Michael", "Marc", "John", "David", "Nick", "Mom", "Al", "Marlana", "Max","Scooter", "Pat", "George", "Lynne", "Tatyana", "Kim", "Kerry", "Enza", "Matt","Liz", "Linda", "Ryan", "Ed", "Frank", "Christine", "Bill", "Jack", "Jill", "Joe", "Harry", "Red", "Fred", "Iggy", "Brian", "Bob", "Paul", "Gil", "Damian", "Kip", "Phil", "Curtis", "Aly", "Richard", "Robin", "Grant", "Ian", "Raptor", "T-Rex", "Stegosaurux", "Triceratops", "Compy"]

function chunk(source,size)  // non-destructive
  var arrofarr=[], cnt=0;
  while (cnt < source.length)  
    arrofarr.push(source.slice(cnt,cnt+size)); 
    cnt+= arrofarr[arrofarr.length-1].length;
  
  return arrofarr;
  
console.log(chunk(data,16));

// ----------------------------------

function chunkie(source,size)  // destructive
  var arrofarr=[];
  while (source.length)  arrofarr.push(source.splice(0,size)); 
  return arrofarr;

console.log(chunkie(data,16));

【讨论】:

我想要拼接,而不是切片 :) 就是这样。谢谢! 看起来有两个名字被删除了。列表中有 50 个名字;你只返回 48(可被 16 整除)。 你想要Math.ceil,而不是parseInt 更简单:while(data.length) sixteengroup.push(data.splice(0,16));【参考方案4】:

试试这个:

var data = ["Michael", "Marc", "John", "David", "Nick", "Mom", "Al", "Marlana", "Max", 
        "Scooter", "Pat", "George", "Lynne", "Tatyana", "Kim", "Kerry", "Enza", "Matt",
        "Liz", "Linda", "Ryan",
        "Ed", "Frank", "Christine", "Bill", "Jack", "Jill", "Joe", "Harry", "Red",
        "Fred", "Iggy", "Brian", "Bob", "Paul", "Gil", "Damian", "Kip", "Phil", "Curtis", "Aly",
       "Richard", "Robin", "Grant", "Ian", "Raptor", "T-Rex", "Stegosaurux", "Triceratops", "Compy"]


var sixteengroup = [];

var x = -1;
for (var i = 0; i < data.length; i++)

    if (i % 16 == 0) 
        sixteengroup[++x] = [data[i]]
        continue;
     

    sixteengroup[x].push(data[i])



console.log(sixteengroup);

在这里提琴:https://jsfiddle.net/n9ro2vwr/1/

【讨论】:

请详细说明原因,以便将来避免效率低下。也许世界会更美好。 你一一添加。然后你抱怨我的拼接/切片建议被接受了?我在你写你的循环之前大约 5 分钟放弃了我写的循环【参考方案5】:

也许可以创建一个带有 2 个参数的函数来获得数组和第二个参数来限制每秒的宗派数组的项目数量,就像这样?

function data(arr, size) 
  var array = [];
    while(arr.length > 0)
         array.push(arr.splice(0,size));   
    
  return console.log(array);


data(["Michael", "Marc", "John", "David", "Nick", "Mom", "Al", "Marlana", "Max", 
            "Scooter", "Pat", "George", "Lynne", "Tatyana", "Kim", "Kerry", "Enza", "Matt",
            "Liz", "Linda", "Ryan",
            "Ed", "Frank", "Christine", "Bill", "Jack", "Jill", "Joe", "Harry", "Red",
            "Fred", "Iggy", "Brian", "Bob", "Paul", "Gil", "Damian", "Kip", "Phil", "Curtis", "Aly",
           "Richard", "Robin", "Grant", "Ian", "Raptor", "T-Rex", "Stegosaurux", "Triceratops", "Compy"], 16)

https://jsfiddle.net/ToreanJoel/dq7t7snx/

你可以玩一玩,看看是否合你的胃口。

【讨论】:

以上是关于JavaScript:如何将数组中的数据推送到子数组中,每16个项目都有一个数组[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如果javascript中不存在值,如何推送到多维数组

如果项目位于 javascript 对象中,如何将其推送到数组中 [state.lastValue.push 不是函数]

遍历一个数组,将每个项目添加到一个对象并将其推送到 Javascript 中的数组

如何正确地将具有多个元素的新对象推送到数组中?

JavaScript 推送到数组

如何使用ajax将数据推送到数组