我在codewars.com上flatten
kata工作 - 我的代码非常类似于我找到的解决方案,所以我觉得我的逻辑是正确的。但我似乎无法让我的代码工作,我不知道这是一个愚蠢的语法错误,还是我做了一些根本不正确的事情。
说明:
Write a function that flattens an Array of Array objects into a flat Array. Your function
must only do one level of flattening.
flatten([[1,2,3],["a","b","c"],[1,2,3]]) // => [1,2,3,"a","b","c",1,2,3]
使用forEach
的工作解决方案:
var flatten = function (lol){
var res = [];
lol.forEach(function (x) {
if (x instanceof Array)
res = res.concat(x);
else
res.push(x);
});
return res;
}
我的代码使用for
循环:
var flatten = function (array){
var newArray = [];
for (i = 0; i < array.length; i++) {
if (i instanceof Array)
for (e = 0; e < i.length; e++) {
newArray.push(e);
}
else
newArray.push(i);
}
return newArray;
}
答案 0 :(得分:2)
它不起作用的最重要原因是你将索引(i
和e
)视为实际的数组元素(因此,子数组本身) )。 i
不是实际的数组,并且没有任何数组属性。这只是一个数字。
必须通过array[index]
引用每个元素,因此对于数组参数,在顶部循环中,您将检查array[i]
,但最重要的是,如果它不是数组,那就是push()
。
在您的内循环中,您遇到与e
类似的问题。但是,您不能简单地执行array[e]
,因为您要查看的数组将是array[i]
。解决这个问题的正确方法是为数组创建另一个变量OR,只需array[i][e]
。同样,这是您push()
的价值。
我理解这个答案有点模糊,但故意是这样,因为这显然是你要学习的作业。
答案 1 :(得分:0)
if (array[i] instanceof Array)
您的算法看起来很好,但您引用的是一个数字索引,您指的是引用数组元素。修复此问题在3个地方,你的代码应该工作。
答案 2 :(得分:0)
您需要使用原始数组的值来推送/连接到新数组。此外,您不需要检查类型,您可以将所有内容连接起来:
var flatten = function (array) {
var newArray = [];
var arrayLength = array.length;
for (i = 0; i < arrayLength; i++) {
newArray = newArray.concat(array[i]);
}
return newArray;
}
答案 3 :(得分:-1)
扰流:
var flatten = function (array){
var newArray = [];
for (i = 0; i < array.length; i++) {
if (array[i] instanceof Array)
newArray = newArray.concat(array[i]);
else
newArray.push(array[i]);
}
return newArray;
}