Фильтровать вложенный объект - PullRequest
5 голосов
/ 15 апреля 2020

Я получаю объект, который выглядит следующим образом:

 this.tokensData = {
    O: {
        id: 0,
        name: value1,
        organization: organization1,
        ...,
       },
    1: {
        id: 1,
        name: value1,
        organization: organization1,
        ...,
        },
    2: {
        id: 2,
        name: value2,
        organization: organization2,
        ...,
        },
    ...
   }

Я хочу отфильтровать по id и удалить Object, который id соответствует id, который я получаю от store. То, что я пробовал до сих пор:

const filteredObject = Object.keys(this.tokensData).map((token) => {
  if (this.$store.state.id !== this.tokensData[token].id) {
    return this.tokensData[token];
  }
});

Это заменяет Object на undefined - что будет работать для моих целей, но, очевидно, не идеально. Любая помощь очень ценится!

Ответы [ 4 ]

3 голосов
/ 15 апреля 2020

Попробуйте использовать Object.entries, а затем Object.fromEntries() для создания объекта из списка пар ключ-значение:

let store = [0 , 1];

const result = Object.entries(tokensData).filter(([k, v]) => !store.some(s => s == v.id));

console.log(Object.fromEntries(result));

Пример :

let tokensData = {
   O: {
       id: 0,
       name: '',
       organization: '',
      },
   1: {
       id: 1,
       name: '',
       organization: '',
       },
   2: {
       id: 2,
       name: '',
       organization: '',
       }
  }

let store = [0 , 1];

const result = Object.entries(tokensData).filter(([k, v]) => !store.some(s => s == v.id));

console.log(Object.fromEntries(result));
1 голос
/ 15 апреля 2020

Проблема с undefined вызвана использованием this в функции стрелки. Javascript scoping дает другое значение для this, если функция является функцией стрелки.

Кроме того, я предлагаю использовать фильтр.

.map используется для преобразования A -> B .

.filter следует использовать для отфильтровывания объектов.

Теперь, если мы объединим это, это станет чем-то вроде этого.

function filterById(token) {
  return this.$store.state.id !== this.tokensData[token].id;
}

function getTokenData(token) {
  return this.tokensData[token]
}

const token = Object.keys(this.tokensData)
  .filter(filterById)
  .map(getTokenData);
});

Обратите внимание что я не использую функции стрелок. Функция стрелки не может ссылаться на this из-за способа, которым javascript обрабатывает область видимости.

Альтернативным подходом может быть ссылка this на переменная, так что ваша функция стрелка может получить доступ к переменной.

const self = this;
const token = Object.keys(this.tokensData)
  .filter(token => self.$store.state.id !== self.tokensData[token].id)
  .map(token => self.tokensData[token]);

Слишком даже лучше, чем вы могли бы использовать Object.entries. Это вернет массив ключей и значений, которые вы можете деструктурировать с помощью синтаксиса es6 следующим образом: [key, value].

const self = this;
const token = Object.entries(this.tokensData)
  .filter(([key, value]) => self.$store.state.id !== value.id)
  .map(([key, value]) => value);
1 голос
/ 15 апреля 2020

Вы можете сделать это, используя Object.entries и Object.fromEntries:

const filteredObject = Object.fromEntries(
  Object.entries(this.tokensData).filter(
    ([key, value]) => value.id !== this.$store.state.id
  )
)
1 голос
/ 15 апреля 2020

Это можно сделать путем клонирования объекта и удаления объекта с идентификатором:

const removeObjectByID = (obj, id) => {
  // first create a copy of the object
  const copy = JSON.parse(JSON.stringify(obj))
  // next, delete the one entry you don't want
  delete copy[id]
  // finally, return the new object
  return copy
}

// Test
const data = {a:1, b: 2, c: 3}

console.log(removeObjectByID(data, 'b')) // { a: 1, c: 3 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...