【问题标题】:How to merge lists by id in Immutable.js?如何在 Immutable.js 中按 id 合并列表?
【发布时间】:2016-04-11 14:04:21
【问题描述】:

我有一个使用从服务器接收的 JSON 创建的不可变人员列表。我现在通过发送 AJAX 请求来更新其中一个人。来自服务器的响应返回更新的人员。如何使用更新的人员更新不可变列表。我在下面的尝试只是用索引替换列表元素,这会产生不正确的结果。我希望它替换为人员 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 } ]

注意更新后的列表有两个lwhites!

【问题讨论】:

  • 如何使用更新的人员更新不可变列表。抱歉,您如何更新不可变列表?
  • 澄清一下,我不是字面意思。我的意思是获取一个包含更新人员的新列表。

标签: javascript immutable.js


【解决方案1】:

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

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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-13
    • 2021-07-05
    • 2015-07-19
    • 1970-01-01
    • 1970-01-01
    • 2018-09-20
    • 2023-01-11
    • 1970-01-01
    相关资源
    最近更新 更多