Как глубоко фильтровать объекты (не массивы объектов) - PullRequest
0 голосов
/ 25 апреля 2018

Я работаю со структурой данных JS, которая выглядит примерно так:

table = {
  row1: {
    col1: 'A',
    col2: 'B',
    col3: 'C'
  },
  row2: {
    col1: 'D',
    col2: 'A',
    col3: 'F'
  },
  row3: {
    col1: 'E',
    col2: 'G',
    col3: 'C'
  }
};

Как бы вы, ребята, отфильтровали этот объект, используя встроенные в JavaScript функции filter / map / lower для создания массива объекта строкиключи, которые содержат свойство col3 = "C"?

В этом случае будет возвращено ['row1', 'row3'].

Это решение, которое я изначально придумал, основано на другомответ :

Object.keys(Object.keys(table).reduce(function(accumulator, currentValue) {
  if (table[currentValue].col3==='C') accumulator[currentValue] = table[currentValue];
  return accumulator;
}, {}));

Однако я принял решение, приведенное ниже, используя filter(), потому что оно более эффективно.Принятый ответ в синтаксисе ES6, но синтаксис ES5 был предоставлен @Paulpro:

Object.keys(table).filter(function(row) {
  return table[row].col3==='C';
});

(Обратите внимание, что существует похожих решений , но они используют пользовательские функции и некраткий, как принятый ответ, приведенный ниже.)

1 Ответ

0 голосов
/ 25 апреля 2018

Вы можете использовать Object.keys, а затем фильтровать, используя оригинальный объект:

table = {
  row1: {
    col1: 'A',
    col2: 'B',
    col3: 'C'
  },
  row2: {
    col1: 'D',
    col2: 'A',
    col3: 'F'
  },
  row3: {
    col1: 'E',
    col2: 'G',
    col3: 'C'
  }
};

console.log(Object.keys(table).filter(function(t) { return table[t].col3 === 'C'}))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...