Как я могу фильтровать массив без использования filter ()? - PullRequest
0 голосов
/ 11 июля 2020

Цель состоит в том, чтобы пройти через внешний l oop, а затем через внутренний l oop. После этого нам нужно отфильтровать параметр, который передается как «elem». Новый массив (newArr) должен возвращать массив без элемента elem.

function filteredArray(arr, elem) {
  let newArr = [];
  
for(var i = 0; i<= arr.length; i ++){
  for(var j = 0; j<=arr[i].length ; j++){

      if(arr.indexOf(elem)!= -1){
        newArr.push(arr[i]);
      }
  }
}
  
  return newArr;
}

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

Что не так с этим logi c?

Ответы [ 4 ]

2 голосов
/ 11 июля 2020

Если вы хотите получить многомерный массив

function filteredArray(arr, elem) {
    let newArr = [];
  
    for (var i = 0; i < arr.length; i++) {
      let subArray=[];  
      for (var j = 0; j < arr[i].length; j++) {
        if (arr[i][j] !==elem) {
          subArray.push(arr[i][j]);
        }
      }
      newArr.push(subArray)
    }
  
    return newArr;
  }
  
  console.log((filteredArray([[3, 2, 3], [1, 6, 3], [3, 13, 26], [19, 3, 9]], 3)));

И если вам нужен плоский массив в результате

    function filteredArray(arr, elem) {
      let newArr = [];

      for (var i = 0; i < arr.length; i++) {
        for (var j = 0; j < arr[i].length; j++) {
          if (arr[i][j] !==elem) {
            newArr.push(arr[i][j]);
          }
        }
      }
    
      return newArr;
    }
    
    console.log((filteredArray([[3, 2, 3], [1, 6, 3], [3, 13, 26], [19, 3, 9]], 3)));
1 голос
/ 11 июля 2020

Без использования метода filter. Но если вы можете использовать map и reduce, это будет упрощено и позволит избежать обработки с индексами.

const filteredArray = (arr, elem) =>
  arr.map((data) =>
    data.reduce((acc, cur) => (cur !== elem && acc.push(cur), acc), [])
  );

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

Если вам нужен плоский массив, просто измените map на flatMap в приведенном выше коде.

const filteredFlatArray = (arr, elem) =>
  arr.flatMap((data) =>
    data.reduce((acc, cur) => (cur !== elem && acc.push(cur), acc), [])
  );

console.log(
  filteredFlatArray(
    [
      [3, 2, 3],
      [1, 6, 3],
      [3, 13, 26],
      [19, 3, 9],
    ],
    3
  )
);
0 голосов
/ 11 июля 2020

Что не так с этим логом c?

1-Вам необходимо объявить пустые подмассивы перед доступом к ним.

newArr[i] = [];

2- Вы хотите pu sh полный массив (я предполагаю, чтобы сэкономить время), если elem НЕ найден, исправьте условие или введите else.

newArr.push(arr[i]); but you should use this 
newArr[i] = arr[i]; because i created new empty sub arrays.

3-Вам действительно нужно использовать j для go подмассив.

newArr[i].push(arr[i][j]);

4-На него уже был дан ответ, но вам нужно убедиться, что вы не выходите за пределы массива.

i

5-Вам не хватает крайних случаев.

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

function filteredArray(arr, elem) {
  const newArr = [];
  let skip = 0;

  for (var i = 0; i < arr.length; i++) {
    newArr[i] = [];
    skip = arr[i].indexOf(elem);
    for (var j = 0; j < arr[i].length; j++) {
      if (skip !== -1) {
        if (arr[i][j] !== elem) {
          newArr[i].push(arr[i][j]);
        }
      } else {
        newArr[i] = arr[i];
        break;
      }
    }
  }

  return newArr;
}

console.log(filteredArray([[3, 2, 3], [1, 6, 3], [3, 13, 26], [19, 5, 9], [3, 3, 3]], 3)); 
0 голосов
/ 11 июля 2020

Исправления

  • i <= arr.length => i < arr.length
  • arr.indexOf(elem) => arr[i].indexOf(elem)

function filteredArray(arr, elem) {
  let newArr = [];

  for (var i = 0; i < arr.length; i++) {
    for (var j = 0; j < arr[i].length; j++) {

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

  return newArr;
}

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