开发者问题收集

如何获取嵌套元素的值

2023-04-29
99

我试图在 js 中做得更好,但在尝试解决这个问题时我遇到了困难,“使用 for 循环,返回传递数组的过滤版本,这样任何嵌套在包含 elem 的 arr 中的数组都已被删除。”

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

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

上面的代码是我到目前为止编写的。我得到了一个错误;

for (let k=0; k<newArr[i].length; k++){

TypeError: Cannot read properties of undefined (reading 'length') "

你们能帮我吗,我该如何修复代码?

编辑:代码应该返回 []

3个回答
  1. 由于您要调用 Array.prototype.splice 函数,因此您必须反向循环。
  2. 其次,找到数字后,中断内循环。
function filteredArray(arr, elem) {
  let newArr = [];
  // Only change code below this line
  for (let j=0;j<arr.length;j++){
    newArr.push(arr[j])
  }
  
  for(let i = newArr.length - 1; i >= 0; i--){
    for (let k=0;  k < newArr[i].length; k++){
      if (newArr[i][k] === elem){
        newArr.splice(i,1);
        break;
      }
    }
    

  }
  // Only change code above this line
  return newArr;
}

console.log(filteredArray([[3, 2, 3], [1, 6, 3], [3, 13, 26], [19, 3, 9]], 3));
Ele
2023-04-29

在这里,我以相反的顺序迭代 newArr 数组,并以相反的顺序迭代嵌套数组。这确保使用 splice 方法从数组中删除元素不会导致循环跳过元素或访问未定义的值。

 function filteredArray(arr, elem) {
      let newArr = [];
      for (let j = 0; j < arr.length; j++) {
        newArr.push(arr[j]);
      }
      for (let i = 0; i < newArr.length; i++) {
        if (Array.isArray(newArr[i])) {
          for (let k = 0; k < newArr[i].length; k++) {
            if (newArr[i][k] === elem) {
              newArr.splice(i, 1);
              i--;
              break;
            }
          }
        }
      }
      return newArr;
    }
    
    console.log(filteredArray([[3, 2, 3], [1, 6, 3], [3, 13, 26], [19, 3, 9]], 3)); // should return []
Saket Agarwal
2023-04-29

您应该尽可能利用 JavaScript 解释器提供的函数和高级函数。有许多此类函数可对数组等集合进行操作。

其中一个函数: Array.prototype.filter

根据两个条件进行过滤:

  1. 测试 arr 的元素是否为数组(即 Array.prototype.isArray
  2. 测试元素是否等于 elem (即 Array.prototype.includes - 此答案假设 elem 是原始类型(请参阅下面的注释))
let filteredArray = (arr, elem) => {
  let result = []
  for ( inner of arr ) {
    if ( !( Array.isArray(inner) && inner.includes(elem)) )
      result.push(inner)
  }
  return result
}

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

注意: Array.prototype.includes 使用相等性进行测试,并且对象是引用,因此它们的“值”不等于原始值。示例:

let x = [ 1 ]
let y = [ 1 ]
let val = [ [ 1 ], y ]
console.log(val.includes(x))
console.log(val.includes(y))
Tibrogargan
2023-04-29