我觉得Immutable.js很有趣,并且在将对象与数组合并时遇到了问题。
我的合并职能是:
function singleTrackReducer(state = Immutable.Map(singleTrack), action) {
switch (action.type){
case AudioFormActions.CHANGE:
return state.mergeDeepWith((prev, next) => next, action.entity);
default:
return state;
}
}合并到的对象如下所示:
const singleTrack = {
songTitle: '',
mainArtists: [],
featuredArtists: [],
releaseDate: '',
primaryGenre: '',
isExplicit: false,
labelName:'',
upCode: '',
eanCode: '',
isrcCode:'',
copyRight: ''
};我正在尝试更新mainArtists属性。例如,我可以向我的艺术家数组中添加几个艺术家,并成功地执行更新。但是,当我从数组中删除一个对象时,它似乎是用前面的一个对象填充的。
比如说,艺术家数组是drake,rihanna,tyga
如果我用动作实体drake,rihanna,tyga,john调用这个函数,它更新得很好,mainArtists属性变成drake,rihanna,tyga,john。
当我删除一个艺术家示例tyga,数组是drake,rihanna,john
mainArtist的财产变成德雷克,蕾哈娜,约翰,约翰
有人能解释我如何解决这个问题吗?
发布于 2016-06-13 00:51:59
我认为这段代码将帮助您理解这个问题:
var Immutable = require('immutable');
console.log(
Immutable.List(['a', 'b', 'c'])
.mergeDeep(['a', 'c'])
);
// output: List [ "a", "c", "c" ]
console.log(Immutable.List(['a', 'b', 'c'])
.mergeDeepWith((prev, next) => {
console.log(`Conflict between ${prev} and ${next}.`);
return next;
}, ['a', 'c'])
);
// output: Conflict between a and a.
// Conflict between b and c.
// List [ "a", "c", "c" ]基本上,当合并列表时,项目似乎在每个索引上从一个复制到另一个,如果在该索引上已经有一个值,则被认为是一个冲突:
您可以使用集合,但这基本上是执行联合操作,因此不会删除任何内容:
console.log(
Immutable.Set(['a', 'b', 'c'])
.mergeDeep(['a', 'c'])
);
// output: Set { "a", "b", "c" }我觉得你根本不想把这份名单合并.我认为您只是想复制新值而不是旧值。如果是这样的话,也许你只是在找merge而不是mergeDeep
var state = Immutable.Map({
songTitle: '',
mainArtists: [],
featuredArtists: [],
releaseDate: '',
primaryGenre: '',
isExplicit: false,
labelName:'',
upCode: '',
eanCode: '',
isrcCode:'',
copyRight: ''
});
function doMerge(state, newState) {
// no deep merge here, just copy whatever fields are present in newState
return state.merge(newState);
}
console.log(state.get('mainArtists'));
// output: []
state = doMerge(state, {
mainArtists: ['drake', 'rihanna', 'tyga']
});
console.log(state.get('mainArtists'));
// output: List [ "drake", "rihanna", "tyga" ]
state = doMerge(state, {
mainArtists: ['drake', 'rihanna', 'tyga', 'john']
});
console.log(state.get('mainArtists'));
// output: List [ "drake", "rihanna", "tyga", "john" ]
state = doMerge(state, {
mainArtists: ['drake', 'rihanna', 'john']
});
console.log(state.get('mainArtists'));
// output: List [ "drake", "rihanna", "john" ]https://stackoverflow.com/questions/37779862
复制相似问题