我创建了一个JavaScript函数,它可以提取数组中所有可以继承的子数组,并将它们返回到另一个数组中 这是代码
function contigious_sub_array (arr) {
var output = [], worker = [];
for (var i = 0; i < arr.length; i++) {
worker = [];
output.push(arr[i]); // On ajoute la première val
var chien = arr[i];
worker.push(chien); // Tableau worker qui va contenir la première val + les suivantes
for (var j = (i + 1); j < arr.length; j++) {
worker.push(arr[j]);
output.push(worker);
};
worker = [];
};
return output;
}
然而,当我做console.log(contigious_sub_array([1, 2, 3]))
时,
我没有得到预期的结果,索引1的值为[1, 2, 3]
时应为[1, 2]
这可能有什么问题?
答案 0 :(得分:0)
有几个问题可能导致问题。首先,将worker
数组推送到output
数组;这只会将对前者的引用推送到后者,因此当您再次修改worker
时,该更改会反映在output
数组的多个条目中。
其次,你的两个循环结合起来迭代输入数组的整个长度,因此最终output
中的一个条目与输入arr
相同。
您可以使用.slice()
创建数组的副本来解决前一个问题 - 请注意,它只会创建一个浅表副本,因此如果您的数组包含对象而不是数字,这将无法工作。
如果数组的长度与输入数组相同,则可以通过合并检查来排除output
数组。这段代码也有些简化:
function contigious_sub_array (arr) {
var output = [], worker = [];
for (var i = 0; i < arr.length; i++) {
worker = [];
for (var j = i; j < arr.length; j++) {
worker.push(arr[j]);
if (worker.length != arr.length) {
output.push(worker.slice());
}
};
};
return output;
}
示例输出:
注意:这假设您不希望output
中与[1, 2]
对应的条目以及与[2, 1]
对应的其他条目