Глубокая фильтрация в иерархическом объекте - PullRequest
0 голосов
/ 01 января 2019

У меня есть иерархический объект javascript, который мне нужен, чтобы отфильтровать некоторые его элементы.Интересно, есть ли простой способ сделать это.

Например, у меня есть объект actions, как показано ниже.Я хочу отфильтровать те, которые имеют default свойство, которое установлено на true.

let actions={
  sql: [
  {
    content: 'aaa',
    default: true
  },
  {
    stmt: 'bbb'
  },
  {
    stmt: 'ccc',
    default: true
  }],
  email: [
  {
    content: 'xxx',
    default: true
  }]
}

Так что в конечном итоге я хочу иметь что-то вроде:

let filteredActions={
  sql: [
  {
    stmt: 'bbb'
  }
  ],
  email: []
}

Вот какЯ пытаюсь решить мою проблему, но, похоже, она не работает.

getNonDefaultActions = actions =>
  map(actions, (actionListByType, key) => {
    actionListByType.filter(action => !(action.defaultFlag === true))
});

Кажется, ничего не было отфильтровано.Любое решение приветствуется.Кроме того, если lodash предоставляет что-то удобное для решения проблем такого типа, это было бы замечательно

Ответы [ 3 ]

0 голосов
/ 01 января 2019

Object.entries(actions).forEach(([k, v]) => actions[k] = v.filter(f => !f.default)); делает трюк в ванили.Идея состоит в том, чтобы перебирать пары объектов ключ-значение и переназначать каждое значение на отфильтрованную версию самого себя.

const actions = {"sql":[{"content":"aaa","default":true},{"stmt":"bbb"},{"stmt":"ccc","default":true}],"email":[{"content":"xxx","default":true}]};

Object.entries(actions).forEach(([k, v]) => actions[k] = v.filter(f => !f.default));
  
console.log(actions);
0 голосов
/ 01 января 2019

Вы можете получить новый объект с отфильтрованными свойствами.

let actions = { sql: [{ content: 'aaa', default: true }, { stmt: 'bbb' }, { stmt: 'ccc', default: true }], email: [{ content: 'xxx', default: true }] },
    result = Object.assign(
        ...Object
            .entries(actions)
            .map(([k, v]) => ({ [k]: v.filter(o => o.default !== true) }))
    );

console.log(result);
0 голосов
/ 01 января 2019

Вы можете использовать lodash's _.mapValue() с _.reject():

const actions = {"sql":[{"content":"aaa","default":true},{"stmt":"bbb"},{"stmt":"ccc","default":true}],"email":[{"content":"xxx","default":true}]}

const result = _.mapValues(actions, arr => _.reject(arr, 'default'))

console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
...