我有一个分层的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为此类问题提供了一些方便的方法,那将会很棒
答案 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);