从另一个数组的长度调用所有可能的数组 [英] Calling all possible arrays from the length of another array
问题描述
我正在处理的是一个菜单,它根据数组长度自动更新其条目。如果将新对象添加到数组,它会将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屋!