如何在 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);
我有一个不可变的人员列表,它是使用从服务器收到的 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);