Как удалить определенные элементы из массива в новый массив, а остальные оставить только исходный массив? - PullRequest
1 голос
/ 04 июля 2019

Как написать функцию для удаления определенных элементов в новый массив и оставить исходный массив только с оставшимися элементами?

первая часть проста, если использовать цикл for, помещающий четные числа в новый массив, но изменить исходный массив, оставив только нечетные числа, трудно

function remove(arr, cb){

 var removed = [];
 var newArr = [];

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

   if(cb(arr[i], i, arr)) {
     removed.push(arr[i]);

    } 

 }

 return removed;

} 

Ответы [ 4 ]

0 голосов
/ 04 июля 2019

Вы определенно были на правильном пути со своим решением, несколько настроек, и мы можем сделать его очень удобочитаемым, а также очень простым в работе.Я пытался сохранить формат того, что выглядело так, как будто вы делаете.

Я воспользуюсь здесь преимуществом деструктуризации, это можно будет вернуть как просто объект, а затем ссылаться на свойства.

const myArr = [0,1,2,3,4,5,6,7,8,9,10];

const splitItems = (arr, logicFunc) => {
    let secondSet = []

    const firstSet = arr.filter(v => {
      if (logicFunc(v)) return true
      else secondSet.push(v)
    })

    return { firstSet, secondSet }
}

const myLogicFunc = v => (v < 3 || v == 9)
const { firstSet, secondSet } = splitItems(myArr, myLogicFunc)

console.log(`My first set: ${firstSet}`) // My first set: 0,1,2,9
console.log(`My second set: ${secondSet}`) // My second set: 3,4,5,6,7,8,10

/* OR without destructuring:
const myArrays = splitItems(myArr, myLogicFunc)

console.log(`My first set: ${myArrays.firstSet}`)
console.log(`My second set: ${myArrays.secondSet}`)
*/

Пожалуйста, дайте мне знать, если у вас есть какие-либо вопросы

0 голосов
/ 04 июля 2019

Используйте оператор else, чтобы заполнить newArr значениями, которые должны остаться в исходном arr, затем очистите его, используя splice(), прежде чем копировать элементы из newArr обратно в него.

function remove (arr, cb) {
  var removed = [];
  var newArr = [];

  for (var i = 0; i < arr.length; i++) {
    if (cb(arr[i], i, arr)) {
      removed.push(arr[i]);
    } else {
      newArr.push(arr[i]);
    }
  }

  arr.splice(0);

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

  return removed;
}
0 голосов
/ 04 июля 2019

В современных приложениях JavaScript мы не изменяем массивы, мы создаем новый массив, это позволяет избежать побочных эффектов, поэтому мы создаем два новых массива

const split = (source, conditionFunc) = [ source.filter(i => conditionFunc(i)), source.filter(i => !conditionFunc(i))];

Тогда у вас есть массив из двух массивов значений, которые соответствуют условию, и тех, которые не вызывают и не вызывают побочных эффектов.

const odssAndEvens = split(source, i => i % 2 === 1);

Или с помощью Reduce, чтобы не повторять массив дважды

const split = (source, conditionFunc) = source.reduce((results, item) => {
  if (conditionFunc(item)) {
    results[0].push(item);
  } else {
    results[1].push(item);
  }
  return results;
}, [[],[]]);
0 голосов
/ 04 июля 2019

Добро пожаловать в Stackoverflow!

Лично я бы избегал всего, что изменяет входной параметр, так как это увеличивает сложность кода и затрудняет рассуждения о том, что происходит с вызывающей стороной.

Вместо этого я бы написал метод, который возвращает массив из двух массивов.Это можно легко разделить на две переменные в вызывающем конце, используя деструктуризацию массива.

См. Пример ниже:

const splitArr = (arr, pred) =>
  arr.reduce(
    (prev, curr, idx) => {
      prev[+pred(curr, idx, arr)].push(curr);
      return prev;
    }, [[], []]
  );

// usage //

const myArr = [1, 2, 3, 4];
const [arr1, arr2] = splitArr(myArr, x => x > 2);
console.log(arr1);
console.log(arr2);

Поскольку pred - это функция, которая возвращает логическое значение, мы можем привести это значение к 0 или 1, используя +someBoolean.Затем мы можем использовать это значение в качестве индекса, чтобы решить, в какой из двух выходных массивов это значение следует поместить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...