Javascript 如何在Immutable js中删除映射内的数组元素?

Javascript 如何在Immutable js中删除映射内的数组元素?,javascript,immutable.js,Javascript,Immutable.js,我对Immutable还不熟悉,对于如何删除映射中的数组元素,我感到非常困惑。我不想使用fromJs。我知道有很多关于堆栈溢出的资源,但是这个方法对我不起作用 const test=Map({ arr:[{ 身份证号码:1 }, { 身份证号码:2 }, { 身份证号码:3 }] }); console.log(test.get('arr')) 以前 arr:[{id:1},{id:2},{id:3}] 我想删除id:3 arr:[{id:1},{id:2}] 使用Immutable.js

我对Immutable还不熟悉,对于如何删除映射中的数组元素,我感到非常困惑。我不想使用
fromJs
。我知道有很多关于堆栈溢出的资源,但是这个方法对我不起作用

const test=Map({
arr:[{
身份证号码:1
}, {
身份证号码:2
}, {
身份证号码:3
}]
});
console.log(test.get('arr'))
以前

arr:[{id:1},{id:2},{id:3}]
我想删除id:3

arr:[{id:1},{id:2}]

使用Immutable.js时,通常不应使用普通js数据结构。因此,您可以创建如下数据:

test = Map({ arr: List([ Map({ id: 1 }), Map({ id: 2 }), Map({ id: 3 }) ]) })
并可以按如下方式移除第三个对象:

test.set('arr', test.get('arr').filter(x => x.get('id') != 3))

使用Immutable.js时,通常不应使用普通js数据结构。因此,您可以创建如下数据:

test = Map({ arr: List([ Map({ id: 1 }), Map({ id: 2 }), Map({ id: 3 }) ]) })
并可以按如下方式移除第三个对象:

test.set('arr', test.get('arr').filter(x => x.get('id') != 3))

这里的基本问题是,当您创建贴图时,它只是粗略地将对象关键点转换为贴图关键点。它不会深度转换对象。这是可以的,但是你必须正确处理这个案例,当你第一次处理这种情况时可能会有点混乱

首先,你应该明白这

const test = Map({
  arr: [{
    id: 1
  }, {
    id: 2
  }, {
    id: 3
  }]
})
这是

Map {
  arr: [
    { id: 1 },
    { id: 2 },
    { id: 3 }
  ]
}
其中存储在
arr
的值是一个数组,而不是一个不变的列表,并且存储在该数组中的值是对象而不是映射

要更改可变值,您需要同时更新映射和更改数组。请注意,您希望不可变地执行此操作,以便不更改存储在不可变映射中的可变值。这样做的不变方式如下所示

如果知道id为3的对象所在的索引,则可以将该索引切掉

const i = 2
test = test  // remember that any change to an immutable object creates a new object, so assignment is required
  .update('arr', (arr) => {    
    return arr.slice(0, i).concat(arr.slice(i + 1))
  })
如果你不知道索引,那么你可以过滤数组

test = test  // remember that any change to an immutable object creates a new object, so assignment is required
  .update('arr', (arr) => {    
    return arr.filter((obj) => obj.id !== 3)
  })
这种经历可能有点痛苦,所以我写这篇文章专门帮助处理混合嵌套数据结构。使用mudash可以实现与上面相同的效果

const _ = require('mudash')

// delete, this correctly traverses mixed structures...
test = _.delete(test, 'arr.2')

//update/filter, these methods correctly handle both immutable and stadard js types...
test = _.update(test, 'arr', (arr) => _.filter(arr, (obj) => obj.id !== 3))

这里的基本问题是,当您创建贴图时,它只是粗略地将对象关键点转换为贴图关键点。它不会深度转换对象。这是可以的,但是你必须正确处理这个案例,当你第一次处理这种情况时可能会有点混乱

首先,你应该明白这

const test = Map({
  arr: [{
    id: 1
  }, {
    id: 2
  }, {
    id: 3
  }]
})
这是

Map {
  arr: [
    { id: 1 },
    { id: 2 },
    { id: 3 }
  ]
}
其中存储在
arr
的值是一个数组,而不是一个不变的列表,并且存储在该数组中的值是对象而不是映射

要更改可变值,您需要同时更新映射和更改数组。请注意,您希望不可变地执行此操作,以便不更改存储在不可变映射中的可变值。这样做的不变方式如下所示

如果知道id为3的对象所在的索引,则可以将该索引切掉

const i = 2
test = test  // remember that any change to an immutable object creates a new object, so assignment is required
  .update('arr', (arr) => {    
    return arr.slice(0, i).concat(arr.slice(i + 1))
  })
如果你不知道索引,那么你可以过滤数组

test = test  // remember that any change to an immutable object creates a new object, so assignment is required
  .update('arr', (arr) => {    
    return arr.filter((obj) => obj.id !== 3)
  })
这种经历可能有点痛苦,所以我写这篇文章专门帮助处理混合嵌套数据结构。使用mudash可以实现与上面相同的效果

const _ = require('mudash')

// delete, this correctly traverses mixed structures...
test = _.delete(test, 'arr.2')

//update/filter, these methods correctly handle both immutable and stadard js types...
test = _.update(test, 'arr', (arr) => _.filter(arr, (obj) => obj.id !== 3))

测试。删除(键)?请提供一个我无法理解的例子@WilomGfxtest.deleteIn(key)?请提供一个我无法理解的例子@WilomGfx