从另一个数组的长度调用所有可能的数组 [英] Calling all possible arrays from the length of another array

查看:71
本文介绍了从另一个数组的长度调用所有可能的数组的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在处理的是一个菜单,它根据数组长度自动更新其条目。如果将新对象添加到数组,它会将10个对象属性组(在本例中为IDnumbers)添加到菜单中。

What I'm working on is a menu that auto updates its entries based on an array length. It adds groups of 10 objects' properties (in this case "IDnumbers") to the menu if a new object is added to the array.

var arraysOfObject = [], obj = {"IDNumber": ""};
for(i = 0; i<42; i++){
arraysOfObject.push({"IDNumber": "Number " + i});}

上面是包含42个具有特定属性的对象的数组。

Above is the array holding 42 objects with a specific property.

var array2 = [];
    var leftOver = arraysOfObject.length % 10;
    var groupsOfTen = (arraysOfObject.length - leftOver)/10;
    for (var i = 0; i < groupsOfTen; i++) {
        array2.push([]);
        for (var j = i*10; j < i*10 + 10; j++)
            array2[i].push(arraysOfObject[j]["IDNumber"]);
    } 

    //now the leftover
    if (leftOver > 0) {
        array2.push([]);
        for (var i = groupsOfTen*10; i < arraysOfObject.length; i++)
            array2[array2.length-1].push(arraysOfObject[i]["IDNumber"]);
    }

上面的 array2 是存储可以从 arraysOfObject 中按10分组的所有可能数组的数组。在这种情况下,它有5个内部,因为4个数组包含40个对象,1个数组包含2个剩余部分。

The array2 above is the array that stores all the possible arrays that can be grouped by 10 from arraysOfObject. In this case there are 5 inside of it, because 4 arrays holds 40 objects, and 1 array holds the 2 remainders.

这一切都正常,但放置<$菜单中的c $ c> array2 显示所有可能的 IDnumbers 组合在一起,但未单独分组。我必须在其中声明每个可能的数组,如此 sets = [array2 [0],array2 [1],array2 [2],array2 [3],array2 [4]]; 如果有第6个可能的数组,因为对象#51已被添加到 arraysOfObject ,我必须输入 array2 [5]

That all works fine, but placing the array2 inside the menu displays all possible IDnumbers grouped together, but not grouped individually. I have to declare each possible array inside of it like so sets = [array2[0], array2[1], array2[2], array2[3], array2[4]]; If there's a 6th possible array because object #51 has been added to arraysOfObject, I have to input it with array2[5].

我不希望它依赖于我的输入,但它知道可能的数组的数量并且它自动显示在。我该怎么做?

I don't want it to depend on my input, but that it knows the number of possible arrays and that it displays it automatically in sets. How do I do that?

var gui = new dat.GUI();
var guiData = function() {
  this.message = "Dat.Gui menu";
  this.system = 0;
  this.Sets = 0;
};

var data = new guiData();
sets = [array2[0], array2[1], array2[2], array2[3], array2[4],  array2[5]];

gui.add(data, 'message', 'Dat.Gui Menu!');
gui.add(data, 'system', {
  "1": 0,
  "2": 1,
  "3": 2,
  "4": 3,
  "5": 4,
  "6": 5,
}).name('system #').onChange(function(value) {
  updateSets(value);
});
gui.add(data, 'Sets', sets[0]).onChange();

function updateSets(id) {
    var controller = gui.__controllers[2];
    controller.remove();
    gui.add(data, 'Sets', sets[id]).onChange();
    
    data.Sets = 0;
    gui.__controllers[2].updateDisplay();
}

<script src="https://cdnjs.cloudflare.com/ajax/libs/dat-gui/0.6.1/dat.gui.min.js"></script>

<script>
var arraysOfObject = [], obj = {"IDNumber": ""};
for(i = 0; i<42; i++){
arraysOfObject.push({"IDNumber": "Number " + i});}

var array2 = [];
    var leftOver = arraysOfObject.length % 10;
    var groupsOfTen = (arraysOfObject.length - leftOver)/10;
    for (var i = 0; i < groupsOfTen; i++) {
        array2.push([]);
        for (var j = i*10; j < i*10 + 10; j++)
            array2[i].push(arraysOfObject[j]["IDNumber"]);
    } 

    //now take care of the leftover
    if (leftOver > 0) {
        array2.push([]);
        for (var i = groupsOfTen*10; i < arraysOfObject.length; i++)
            array2[array2.length-1].push(arraysOfObject[i]["IDNumber"]);
    }
</script>

推荐答案

我认为最简单的解决方案是使用ES2015的传播运营商我不知道你是否还想使用...

I think the easiest solution would be to use ES2015's spread operator which I don't know if you would want to use yet...

ES2015方法(演示

ES2015 method (demo)

sets = [...array2];

在演示中还有一些其他更改来设置系统变量

There are a few other changes in the demo to set the system variable

但仔细研究后,您可以使用 SO回答使用 slice()对数组进行分块。另外,我不确定为什么一个对象被用来创建数组条目时它最终只是一个字符串... 演示

But after taking a closer look, you can optimize the code by using the method from this SO answer to chunk your array using slice(). Also, I'm not sure why an object was used to create array entries when it just ends up as a string... demo

var arraysOfObject = [],
  system = {},
  chunk = 10,
  size = 92;

for (var i = 0; i < size; i++) {
  arraysOfObject.push("Number " + i);
}

var sets = [];
var index = 0;
for (i = 0; i < size; i += chunk) {
  sets.push(arraysOfObject.slice(i, i + chunk));
  system[index + 1] = index++;
}

var gui = new dat.GUI();
var guiData = function() {
  this.message = "Dat.Gui menu";
  this.system = 0;
  this.Sets = 0;
};

var data = new guiData();

gui.add(data, 'message', 'Dat.Gui Menu!');
gui
  .add(data, 'system', system)
  .name('system #')
  .onChange(function(value) {
    updateSets(value);
  });
gui.add(data, 'Sets', sets[0]).onChange();

function updateSets(id) {
  var controller = gui.__controllers[2];
  controller.remove();
  gui.add(data, 'Sets', sets[id]).onChange();

  data.Sets = 0;
  gui.__controllers[2].updateDisplay();
}

这篇关于从另一个数组的长度调用所有可能的数组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆