循环到嵌套数组

时间:2019-03-29 10:12:05

标签: javascript

我正在做一个练习,要求我删除具有与另一个变量匹配的元素的数组。

例如

filteredArray([[10, 8, 3], [14, 6, 23], [3, 18, 6]], 18)

应返回[[10, 8, 3], [14, 6, 23]]

考虑到我们正在使用嵌套数组这一事实,尽管我打算使用double for循环到每个元素中。

赞:

function filteredArray(arr, elem) {
  let newArr = [];
  for (let i = 0; i < arr.length; i++) {
    for (let j = 0; j < arr[i].length; j++) {
      if (arr[i][j] != elem) {
        newArr.push(arr[i]);
      }
    }
    // change code above this line
    return newArr;
  }
}

console.log(filteredArray([[3, 2, 3], [1, 6, 3], [3, 13, 26], [19, 3, 9]], 3));

预期结果是有一个空数组,但是它给了我: [3, 2, 3]

正确的解决方案如下:

function filteredArray(arr, elem) {
  let newArr = [];
  for (let i = 0; i < arr.length; i++) {
    if (arr[i].indexOf(elem) == -1) { //Checks every parameter for the element and if is NOT there continues the code
      newArr.push(arr[i]); //Inserts the element of the array in the new filtered array
    };
  };
  return newArr;
};

console.log(filteredArray([[3, 2, 3], [1, 6, 3], [3, 13, 26], [19, 3, 9]], 3));

这有道理,但我不明白为什么我的错。

4 个答案:

答案 0 :(得分:2)

您的问题在于:

if (arr[i][j] != elem) {
  newArr.push(arr[i]);
}

每次内部元素(newArr)不等于过滤器元素(newArr[i][j])时,您就将数组推入elem。相反,如果newArr中的所有项目都不等于arr[i],则想将其推入elem。您可以通过几种方法执行此操作,一种方法是使用变量found作为标志,指示是否在任何内部列表中都找到了elem,然后将其添加找不到:

function filteredArray(arr, elem) {
  let newArr = [];
  for (let i = 0; i < arr.length; i++) {
    let found = false;
    for (let j = 0; j < arr[i].length; j++) {
      if (arr[i][j] == elem) {
        found = true;
      }
    }
    
    if(!found) {
      newArr.push(arr[i]);
    }
  }
  
  // move return out of for loop
  return newArr;  // change code above this line
  
}
console.log(filteredArray([[3, 2, 3], [1, 6, 3], [3, 13, 26],
[19, 3, 9]], 3));

答案 1 :(得分:1)

您之所以得到[3, 2, 3],是因为您是从第一个for循环的内部返回的。因此,它只检查第一个内部数组。即使将其移到外部,也会返回整个2d数组,因为每个内部数组都有一个会失败arr[i][j] == elem条件的元素。

或者,您可以像这样使用filterincludes

function filteredArray(arr, elem) {
  return arr.filter(a => !a.includes(elem))
}
console.log(filteredArray([[3, 2, 3], [1, 6, 3], [3, 13, 26], [19, 3, 9]], 3));

答案 2 :(得分:0)

您检查子数组的每个元素,如果不匹配elem,则将子数组推入结果。这意味着对于第一个示例中的[3, 18, 6],它将针对3elem)检查18,然后推送该数组,针对{{1 }},它不会完全满足条件,然后它将与确实匹配的18对照elem进行检查,再次将数组推入 。相反,您应该根据值检查整个数组,然后按入。

6

答案 3 :(得分:0)

您的代码中有一些错误的地方:

  • 您让for循环返回。
  • 检查每个子数组中的每个元素,并在存在差异时推送到结果数组

我如下编辑您的代码:

{{1}}