gpt4 book ai didi

javascript - 操作数组 Javascript

转载 作者:行者123 更新时间:2023-11-28 11:21:17 26 4
gpt4 key购买 nike

我有一个像这样的数组..

 var array = [2,a,b,3]

我想安排一下,这样它就可以像这样显示控制台数组
//console.log
[1,a,b,1]
[1,a,b,2]
[1,a,b,3]
[2,a,b,1]
[2,a,b,2]
[2,a,b,3]

更新

如果我想循环数组中的每个数字怎么办,如果该数组不是静态的而是动态的怎么办
var array = [2,'a','b',3]
var array = [2,'a',4,'c','b',3]
var array = [2,'a']

我想把那个控制台结果放在数组中

如果有人想知道我为什么这样做,因为我有嵌套数组,我将所有 Object.prototypename 保存在一个数组中,这样我就可以称它为 leater,

这个例子
var data = [{a:0,b:[{c:0},{c:0}]},{a:0,b:[{c:0},{c:0}]}]

我有功能所以它会返回
[2,a,b,2,c]

然后我可以调用它
data [2][a][b][2][c]

我的函数可以根据所选数据返回任何内容,所以我想做这个,但卡在这里

最佳答案

function clone(arr, i, values) {
var newArr = arr.slice();
values.forEach(v => newArr[v.index] = Math.floor(i / v.breaker) % v.max + 1);
return newArr;
}

function result(arr) {
var n = 1,
values = arr.reduceRight((acc, e, i) => {
if(typeof e === "number") {
acc.push({
index: i,
max: e,
breaker: n
});
n *= e;
}
return acc;
}, []);

var res = [];
for(var i = 0; i < n; i++) {
res.push(clone(arr, i, values));
}
return res;
}

console.log( result([2,'a','b',3,4]) );



举例说明:

arr[2, a, 3]

那么 values 将是:
[
{
index: 0,
max: 2,
breaker: 3
},
{
index: 2,
max: 3,
breaker: 1
}
]

n ,排列的数量是: 2 * 3 === 6

使用 breaker 属性:

clone 函数克隆数组时,它将根据当前排列的索引 i 更新克隆的数字。
breaker 使得可以不更频繁地增加早期(第一次遇到)数字。要增加一个数字,我们需要等待 N 次(排列),其中 N 是该数字左侧数字的排列数。在上面的例子中:我们每 2 个排列更新 3 的位置(每次 3 的位置完成一个循环)。

如果数组是: [2, 3, 7],那么:
  • 要增加 7 的数字,我们不必等待。它将不间断地循环,直到完成所有排列。因此 breaker === 1
  • 要增加 3 的数字,我们必须等待 7 完成一个循环。 7 将采取 7 排列来完成一个,因此 breaker === 7
  • 要增加 2 的数字,我们必须等待 3 完成一个循环,该循环还必须等待 7 完成一个循环。所以我们必须等待 37 ,因此 breaker === 3 * 7 === 21

  • 数字的 breaker 只是其左侧数字完成一个循环所需的排列数。

    解释 clone 函数:
    clone 函数需要:
  • arr :要根据当前排列的索引克隆和修改的数组。
  • i :当前排列的索引。
  • values :数据对象的数组,包含有关数组 arr 中所有数字的信息(数字的索引,它可以取的最大值,它的 breaker 值)。

  • 该函数首先为数组创建一个克隆 ( var newArr = arr.slice();)。然后循环遍历 values 数组中的所有数据对象,计算数字的值:
    theValueOfTheNumber = (indexOfCurrentPermutation / breaker) % maximumValuePossible + 1;

    我们首先将当前排列的索引除以断路器,以确保在其左侧的数字完成一个循环之前,该值不会增加(如果需要 3 个排列来增加,那么 0 / 31 / 32 / 3 将全部应用 0 时等于 Math.floor )。然后我们通过使用 模运算符 % +1 来限制该值,使其不会超过允许的最大值(初始值),因此值将在 [1 -> maximumValuePossible] 范围内。

    result函数解释:

    这个函数很简单,它只收集所需的信息,例如所有排列的数量 nvalues 数组。

    它使用 reduceRight 从右到左循环数组,因此当遇到一个数字时,我们只需将累积的 n (这将是其左侧的排列数)分配为其 breaker 值。

    之后,我们收集信息,我们只是创建一个循环来循环排列的确切数量,调用 clone 并将其返回值推送到结果数组中。

    关于javascript - 操作数组 Javascript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44689493/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com