分层对象中的深度过滤

时间:2019-01-01 18:54:31

标签: javascript node.js lodash

我有一个分层的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 :(得分:0)

您可以将lodash的_.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>

答案 1 :(得分:0)

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);

答案 2 :(得分:0)

您可以获得具有过滤属性的新对象。

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);