如何在 Immutable.js 中按 id 合并列表?

How to merge lists by id in Immutable.js?

我有一个不可变的人员列表,它是使用从服务器收到的 JSON 创建的。我现在通过发送 AJAX 请求来更新其中一个人。来自服务器的响应returns更新的人。如何用更新的人更新不可变列表。我下面的尝试只是用索引替换列表元素,这会产生不正确的结果。我希望它被人 id 替换。

var Immutable = require('immutable');

// Get me all my people
var peopleResponse = [
    { username: 'jsmith', title: 'Manager',  dept: 'Engineering', salary: 100000 },
    { username: 'lwhite', title: 'Manager',  dept: 'Sales',       salary:  90000 }
];

// Convert to immutable structures
var people = Immutable.fromJS(peopleResponse);
console.log(people);

// Change lwhite's salary to 100,000
var updateResponse =
    { username: 'lwhite', title: 'Manager',  dept: 'Sales',       salary: 100000 }

var updatedPeople = [ Immutable.fromJS(updateResponse) ];

people = people.merge(updatedPeople);
console.log(people);

输出:

List [ Map { "username": "jsmith", "title": "Manager", "dept": "Engineering", "salary": 100000 }, Map { "username": "lwhite", "title": "Manager", "dept": "Sales", "salary": 90000 } ]
List [ Map { "username": "lwhite", "title": "Manager", "dept": "Sales", "salary": 100000 }, Map { "username": "lwhite", "title": "Manager", "dept": "Sales", "salary": 90000 } ]

请注意,更新后的列表有两个 lwhite

我终于想到了以下解决方案。它的灵感来自 。基本概念是人员列表只是一组用户名。实际人员对象将位于以用户名为键的地图中。

var Immutable = require('immutable');

// Get me all my people
var peopleResponse = {
    result: ['jsmith', 'lwhite'],
    entities: {
        people: {
            jsmith: { username: 'jsmith', title: 'Manager',  dept: 'Engineering', salary: 100000 },
            lwhite: { username: 'lwhite', title: 'Manager',  dept: 'Sales',       salary:  90000 }
        }
    }
};

// Convert to immutable structures
var people = Immutable.fromJS(peopleResponse.result);
var peopleByUsername = Immutable.fromJS(peopleResponse.entities.people);
console.log(people);
console.log(peopleByUsername);

// Change lwhite's salary to 100,000
var updateResponse = {
    lwhite: { username: 'lwhite', title: 'Manager',  dept: 'Sales',       salary: 100000 }
};

var updatedPeopleByUsername = Immutable.fromJS(updateResponse);

peopleByUsername = peopleByUsername.merge(updatedPeopleByUsername);

console.log(people);
console.log(peopleByUsername);