如何使setIn在immutable.js中设置数字键而不是数组?

时间:2018-03-05 01:25:29

标签: javascript immutable.js

我有这段代码:

let toDayKey    = toDayKey.toString(); // 1
const deptId    = deptId.toString();  // 3
const jobId     = jobId.toString();  // 87

//Assuming copied.toJS() is any value like "copied job"

const calendar_job_add      = calendar_job_removed.setIn([toDayKey,deptId,jobId], copied_job.toJS());

calendar_job *是一个不可变的地图,我尝试使用jobId作为关键字87

添加值

而不是获取

的对象
calendar_job_add = {"1": { "3": {"87": "the copied job" } } }

我得到了这个:

calendar_job_add = {"1": { "3": {
0: undefined,
1: undefined,
2: undefined,
3: undefined
...
..
.
87: "copied job"
} } }

它似乎将其转换为Array对象而不是Object并插入未定义的值。是什么给了什么?

非常感谢任何建议。

2 个答案:

答案 0 :(得分:1)

很难说出你的代码出了什么问题。当我在setIn上调用Map并将其传递给数字键时,它会一直向下创建嵌套的地图,无论我是使用实际的number用于那些键还是像{{1}这样的字符串},'1''2'

'3'
const before = Immutable.Map({})
console.log('before:', before);

const withStringKeys = before.setIn(['1', '2', '3'], 'a')
console.log('with string keys:', withStringKeys);

const withNumberKeys = before.setIn([1, 2, 3], 'b')
console.log('with number keys:', withStringKeys);

我发现遇到问题的唯一方法是尝试<script src="https://cdnjs.cloudflare.com/ajax/libs/immutable/4.0.0-rc.9/immutable.js"></script>已经是setIn的内容。例如:

List
const before = Immutable.fromJS({ 1: { 2: [] } });
console.log('before:', before);

const withStringKeys = before.setIn(['1', '2', '3'], 'a')
console.log('with string keys:', withStringKeys);

答案 1 :(得分:0)

我刚刚在文档/互联网上找到了可以让我做我想做的事情。

我只需要使用.toJS()将输出对象转换为javascript对象,并使用object[jobId] = "copied job"表示法或Object.assign({},{[jobId]: "copied job" })

添加一个值并将它们重新组合在一起。