Как использовать оператор распространения деструктуризации объекта для удаления нескольких свойств объекта - PullRequest
1 голос
/ 18 апреля 2019

Я использую в моих редукторах карту / ассоциативный массив для хранения объекта через строковый идентификатор.

Когда мне нужен новый элемент на карте, я использую эту конструкцию

rows: { ...state.rows, [row.id]: row }

Когда мне нужно удалить карту формы элемента по идентификатору, я использую это.

const  { [rowId]: deleted, ...rows } = state.rows;

Чем в переменных строках у меня есть карта и свойство с именем rowId отсутствует.

Мне интересно, как я могу это сделать, если у меня есть несколько идентификаторов в массиве, и мне нужно удалить их все с помощью оператора ... и деструктуризации.

const contentIds = ['id1','id2','id3']

// something like ???
const {...[ids], ...rows} 

Да, я могу написать lamdaдля этого или используйте опустить lodash.Но просто интересно, если это возможно.

Большое спасибо

Ответы [ 3 ]

3 голосов
/ 18 апреля 2019

Вы можете уменьшить ключи с объектом.

var object = { id: 1, id1: 2, id2: 3 },
    contentIds = ['id1', 'id2', 'id3'],
    result = contentIds.reduce((o, k) => ({ [k]: _, ...r } = o, r), object);

console.log(result);
0 голосов
/ 18 апреля 2019

Мне интересно, как я могу это сделать, если у меня есть несколько идентификаторов в массиве, и я нужно удалить их все через оператор ... и деструктурировать.

Нет, вы не можете этого сделать, вы, вероятно, путаетесь с синтаксисом rest и spread, ... в левой части назначения - rest, синтаксис не spread

Отдых и распространение

И rest синтаксис ожидает ..., за которым следует имя переменной, то, что вы пытаетесь это syntaxError

const object = {a:1,b:2,c:3}
const a = ['a','b']
const {...[a], ...rows} = object

console.log(rows)

Более того, вы не можете использовать , запятую после rest, так что даже если вы делаете

let {...a, ...rows } = obj 

это все еще недействительно

const object = {a:1,b:2,c:3}

const {...a, ...rows} = object

console.log(rows)

Вы можете использовать решение, предложенное @ nina , или вы можете создать копию объекта и перейти к contentIds и удалить ключ / значение из copyObj, чтобы получить желаемое значение

const object = { id: 1, id1: 2, id2: 3 };
const contentIds = ['id1', 'id2', 'id3'];
const objCopy = object

contentIds.forEach(key=>{
  delete objCopy[key]
})

console.log(objCopy);
0 голосов
/ 18 апреля 2019
const myObj = { id1: 'test', id2: 'test', id3: 'test' }
const idsToFilter = ['id1', 'id2']
const { id1, id2, ...filtered } = myObj
console.log(filtered)

Однако вы не можете сделать это программно, если не знаете точные идентификаторы, которые вы хотите отфильтровать из объекта.если вы хотите сделать это на основе массива идентификаторов, вам нужно использовать что-то вроде этого

function filterObjectByKeys (object, keysToFilter) {
  return Object.keys(object).reduce((accum, key) => {
    if (!keysToFilter.includes(key)) {
      return { ...accum, [key]: object[key] }
    } else {
      return accum
    }
  }, {})
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...