对不可变的JS Map对象执行删除操作

时间:2018-11-20 16:30:33

标签: javascript immutable.js

我有一个不变的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))

5 个答案:

答案 0 :(得分:1)

let data={
  "a": [
    {"name": "foo", "untracked": true},
    {"name": "bar"}
  ],
  "b": [
    {"name": "baz"},
    {"name": "bar", "untracked": true}
  ]
}
Object.entries(data).map(([key, value]) => {
  data[key]=value.filter(ele=>ele.untracked!=true)
});
console.log("result is : ",data)

答案 1 :(得分:0)

根据ImmutableJS文档:

m

示例:

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

文档链接:https://facebook.github.io/immutable-js/docs/#/Map/filter

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

答案 2 :(得分:0)

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

let obj = {
  "a": [{
      "name": "foo",
      "untracked": true
    },
    {
      "name": "bar"
    }
  ],
  "b": [{
      "name": "baz"
    },
    {
      "name": "bar",
      "untracked": true
    }
  ]
}
let newObj = {};

function filterObject(obj) {
  for (let keys in obj) {
    newObj[keys] = obj[keys].filter(item => {
      return item.untracked !== true
    })
  }
}
filterObject(obj)
console.log(newObj)

答案 3 :(得分:0)

data = {
  "a": [
    {"name": "foo", "untracked": true},
    {"name": "bar"}
  ],
  "b": [
    {"name": "baz"},
    {"name": "bar", "untracked": true}
  ]
}

let result = Object.entries(data).map(([key, values])=>(
 { key: values.filter(({untracked})=> !untracked) }
))

console.log(result)

答案 4 :(得分:0)

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