首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Immutable.js mergeDeepWith问题

Immutable.js mergeDeepWith问题
EN

Stack Overflow用户
提问于 2016-06-12 22:52:45
回答 1查看 1.4K关注 0票数 2

我觉得Immutable.js很有趣,并且在将对象与数组合并时遇到了问题。

我的合并职能是:

代码语言:javascript
复制
function singleTrackReducer(state = Immutable.Map(singleTrack), action) {
  switch (action.type){
    case AudioFormActions.CHANGE:
        return state.mergeDeepWith((prev, next) => next, action.entity);
    default:
      return state;
    }
}

合并到的对象如下所示:

代码语言:javascript
复制
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的财产变成德雷克,蕾哈娜,约翰,约翰

有人能解释我如何解决这个问题吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-13 00:51:59

我认为这段代码将帮助您理解这个问题:

代码语言:javascript
复制
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" ]

基本上,当合并列表时,项目似乎在每个索引上从一个复制到另一个,如果在该索引上已经有一个值,则被认为是一个冲突:

  • 对于索引#0,第一个列表中有"a“,第二个列表中有"a”。我们通过选择第二个值来解决冲突(虽然在这种情况下它们是相同的)。所以索引#0得到"a“。
  • 然后我们转到索引#1,发现第一个列表有"b“,第二个列表有"c”。我们通过选择第二个值来解决冲突,因此索引#1获得了"c“。
  • 现在对于索引#2,我们没有冲突,因为只有第一个列表有一个值。我们将"c“保留在索引#2中,因此最后的列表是"a”、"c“、"c”。

您可以使用集合,但这基本上是执行联合操作,因此不会删除任何内容:

代码语言:javascript
复制
console.log(
    Immutable.Set(['a', 'b', 'c'])
        .mergeDeep(['a', 'c'])
);
// output: Set { "a", "b", "c" }

我觉得你根本不想把这份名单合并.我认为您只是想复制新值而不是旧值。如果是这样的话,也许你只是在找merge而不是mergeDeep

代码语言:javascript
复制
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" ]
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37779862

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档