Javascript: Как удалить массив, если у нас есть коллекция свойств элемента - PullRequest
0 голосов
/ 08 июля 2019

считают, что у нас есть такой массив

data = [
    {
        id:'1',
        foo:'foo'
    },
    {
        id:'2',
        foo:'foo'
    },
    {
        id:'3',
        foo:'foo'
    },
    {
        id:'4',
        foo:'foo'
    }

]

тогда у нас есть некоторый идентификатор данных для удаления id_delete = [2,4] Я хочу удалить все соответствующие идентификаторы с данным идентификатором, в SQL мы можем сделать это с помощью delete from data where id in id_delete, как это сделать с фильтром JavaScript?

Ответы [ 4 ]

2 голосов
/ 08 июля 2019

Использование filter:

const data = [{id:'1',foo:'foo'},{id:'2',foo:'foo'},{id:'3',foo:'foo'},{id:'4',foo:'foo'}];
const id_delete = [2, 4];

const res = data.filter(({ id }) => !id_delete.includes(+id));

console.log(res);
.as-console-wrapper { max-height: 100% !important; top: auto; }

Чтобы изменить существующий массив, присвойте результат filter массиву data и используйте let.

let data = [{id:'1',foo:'foo'},{id:'2',foo:'foo'},{id:'3',foo:'foo'},{id:'4',foo:'foo'}];
const id_delete = [2, 4];

data = data.filter(({ id }) => !id_delete.includes(+id));

console.log(data);
.as-console-wrapper { max-height: 100% !important; top: auto; }

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

let data = [{id:'1',foo:'foo'},{id:'2',foo:'foo'},{id:'3',foo:'foo'},{id:'4',foo:'foo'}];
const id_delete = [2, 4];

for (let i = data.length - 1; i > -1; i--) {
  if (id_delete.includes(+data[i].id)) {
    data.splice(i, 1);
  }
}

console.log(data);
.as-console-wrapper { max-height: 100% !important; top: auto; }
0 голосов
/ 08 июля 2019

Использование Рамды:

const data = [{id:'1',foo:'foo'},{id:'2',foo:'foo'},{id:'3',foo:'foo'},{id:'4',foo:'foo'}];
const id_delete = ['2', '4'];
const output = R.reject(item => R.contains(item.id, id_delete), data)
0 голосов
/ 08 июля 2019

Чтобы изменить массив, используйте splice или delete . Вы можете сделать функцию удаления элемента несколько более общей, если для изменения массива требуются параметры, свойство для поиска и соответствующее значение, например

let data = [{id:'1', foo:'foo'},
            {id:'2', foo:'bar'},
            {id:'3', foo:'fum'},
            {id:'4', foo:'fee'}
];

function deleteElementByPropAndValue(array, prop, value) {
  for (var i=array.length; i; ) {
    if (array[--i][prop] == value) {
      array.splice(i, 1);
    }
  }
}

console.log(data);
deleteElementByPropAndValue(data, 'id', '3');
console.log(data);
deleteElementByPropAndValue(data, 'foo', 'fee');
console.log(data);

Вам следует подумать, использовать ли == или === в сравнении на равенство.

splice сократит массив, следовательно, будет работать в обратном направлении через индексы. Вы также можете использовать delete array[index], который не сократит массив, но оставит недостающие элементы в удаленных индексах. Это действительно не имеет значения, если вы используете встроенные методы для итерации по массиву, так как в основном они пропускают отсутствующие элементы, но некоторые этого не делают. И это может иметь значение для других функций, которые не ожидают разреженных массивов.

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

Вы также можете использовать оператор delete для удаления элемента массива в зависимости от позиции. Чтобы получить положение элемента, вы можете использовать Array.findIndex, если вы хотите удалить только один элемент, иначе я предлагаю использовать Array.filter. Также существует Array.splice () для добавления / удаления элемента определенной позиции из массива. Перейдите по ссылкам об операциях удаления, сплайсинга и других полезных сведениях о манипулировании массивами в JavaScript.

https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Operators/delete

https://www.w3schools.com/jsref/jsref_splice.asp

https://www.freecodecamp.org/news/manipulating-arrays-in-javascript/amp/

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