forEach工作 - 为什么不循环?

时间:2014-04-13 18:07:33

标签: javascript

我在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;
}

4 个答案:

答案 0 :(得分:2)

它不起作用的最重要原因是你将索引(ie)视为实际的数组元素(因此,子数组本身) )。 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;
}