Javascript 对不可变的JS映射对象执行删除操作

Javascript 对不可变的JS映射对象执行删除操作,javascript,immutable.js,Javascript,Immutable.js,我有一个结构如下的不可变JS映射 { "a": [ {"name": "foo", "untracked": true}, {"name": "bar"} ], "b": [ {"name": "baz"}, {"name": "bar", "untracked": true} ] } 我想过滤这个对象,只显示被跟踪的对象,即 { "a": [ {"name": "bar"} ], "b": [ {"name": "b

我有一个结构如下的不可变JS映射

{
  "a": [
    {"name": "foo", "untracked": true},
    {"name": "bar"}
  ],
  "b": [
    {"name": "baz"},
    {"name": "bar", "untracked": true}
  ]
}
我想过滤这个对象,只显示被跟踪的对象,即

{
  "a": [
    {"name": "bar"}
  ],
  "b": [
    {"name": "baz"},
  ]
}
有没有一种方法可以让我用不可变的映射操作来实现这一点?我试过下面的方法,但似乎不起作用

object.map((lis) => lis.filter((li) => li.untracked !== true)).toJS()

object.toList().map((lis) => lis.filter((li) => li.untracked !== true))

根据ImmutableJS文档:

filter() returns a new Map with only the entries for which the predicate function returns true.
例如:

function someFilterFunction(entry) {
  return !entry.untracked;
}
myMapOfStuff = myMapOfStuff.filter(someFilterFunction);
链接到文档:


编辑:请记住,不可变集合上的方法将返回您正在操作的集合的副本。如果要保留最新的引用,必须进行重新分配。

循环该对象,并使用旧对象的键创建一个新对象,然后过滤旧对象中未跟踪不等于false的值

让obj={
“a”:[{
“名称”:“foo”,
“未追踪”:正确
},
{
“名称”:“酒吧”
}
],
“b”:[{
“名称”:“baz”
},
{
“名称”:“酒吧”,
“未追踪”:正确
}
]
}
设newObj={};
函数过滤器对象(obj){
用于(让钥匙进入obj){
newObj[keys]=obj[keys]。筛选器(项=>{
return item.untracked!==true
})
}
}
过滤器对象(obj)
console.log(newObj)
let数据={
“a”:[
{“name”:“foo”,“untracked”:true},
{“name”:“bar”}
],
“b”:[
{“名称”:“baz”},
{“name”:“bar”,“untracked”:true}
]
}
Object.entries(data.map)([key,value])=>{
数据[key]=value.filter(ele=>ele.untracked!=true)
});
log(“结果是:”,数据)
数据={
“a”:[
{“name”:“foo”,“untracked”:true},
{“name”:“bar”}
],
“b”:[
{“名称”:“baz”},
{“name”:“bar”,“untracked”:true}
]
}
让result=Object.entries(data.map)([key,values])=>(
{key:values.filter({untracked})=>!untracked}
))

console.log(结果)
未捕获引用错误:未定义结果。另外,您正在更改给定数据的结构,因为输出将是=>[{“key”:[{“name”:“bar”}]},{“key”:[{“name”:“baz”}]}]我忘记声明结果变量了。谢谢@Monic
const data = Immutable.fromJS({
  "a": [
    {"name": "foo", "untracked": true},
    {"name": "bar"}
  ],
  "b": [
    {"name": "baz"},
    {"name": "bar", "untracked": true}
  ]
});

const filteredData = data.map(item => item.filter(iItem => !iItem.get('untracked')));