Javascript 将两个不匹配的数据与immutable.js合并?
我有一段JSON数据,用于动态生成表单,如下所示:Javascript 将两个不匹配的数据与immutable.js合并?,javascript,node.js,ecmascript-6,immutability,immutable.js,Javascript,Node.js,Ecmascript 6,Immutability,Immutable.js,我有一段JSON数据,用于动态生成表单,如下所示: { "form": { "fields": [ { "name": "First Name", "alt": "first_name" }, { "name": "Last Name", "alt": "last_name" }, { "name": "D.O.B.", "alt
{
"form": {
"fields": [
{
"name": "First Name",
"alt": "first_name"
},
{
"name": "Last Name",
"alt": "last_name"
},
{
"name": "D.O.B.",
"alt": "dob"
},
{
"name": "Primary Address",
"alt": "primary_address"
},
{
"name": "Primary City",
"alt": "primary_city"
},
{
"name": "ZIP Code",
"alt": "zip"
},
{
"name": "Country",
"alt": "country"
},
{
"name": "First 4 Phone Digits",
"alt": "first_phone"
},
{
"name": "Phone Number",
"alt": "phone_number"
}
]
},
"someVal": [],
"someVal2": "a string"
}
当我提交此表格时,如果有错误,我将收到以下格式的错误:
[
{
"alt": "primary_city",
"errors": [ "primary_city Error Message" ]
},
{
"alt": "zip",
"errors": [ "zip Error Message" ]
},
{
"alt": "first_name",
"errors": [ "first_name Error Message" ]
},
{
"alt": "dob",
"errors": [ "dob Error Message" ]
},
{
"alt": "primary_address",
"errors": [ "primary_address Error Message" ]
},
{
"alt": "last_name",
"errors": [ "last_name Error Message" ]
}
]
我的目标是将两者合并以获得此格式,合并alts匹配的错误:
{
"form": {
"fields": [
{
"name": "First Name",
"alt": "first_name",
"errors": [ "first_name Error Message" ]
},
{
"name": "Last Name",
"alt": "last_name",
"errors": [ "last_name Error Message" ]
},
{
"name": "D.O.B.",
"alt": "dob",
"errors": [ "dob Error Message" ]
},
{
"name": "Primary Address",
"alt": "primary_address",
"errors": [ "primary_address Error Message" ]
},
{
"name": "Primary City",
"alt": "primary_city",
"errors": [ "primary_city Error Message" ]
},
{
"name": "ZIP Code",
"alt": "zip",
"errors": [ "zip Error Message" ]
},
{
"name": "Country",
"alt": "country"
},
{
"name": "First 4 Phone Digits",
"alt": "first_phone"
},
{
"name": "Phone Number",
"alt": "phone_number"
}
]
},
"someVal": [],
"someVal2": "a string"
}
到目前为止,我一直在努力做到以下几点:
import { fromJS, Map, List } from 'immutable';
import form from './json/form.json'
import config from './json/errors.json'
let list = new List([])
list.merge(fromJS(config), fromJS(form));
console.log(list);
console.log(list.toJS())
// console.log(JSON.stringify(newList, null, 2))
我只得到以下输出:
List []
[]
老实说,我不知道如何开始合并它们,文档也没有多大帮助。首先,您需要理解其中的不变性概念
let list = new List([])
const mergedList = list.merge(fromJS(config), fromJS(form));
console.log(list); // prints empty list
不变性意味着原始数据不被更新,例如变异。在您的示例中,这意味着原始列表对象仍然为空。但是.merge返回一个新列表,该列表具有合并操作的结果
然后您将看到Immutable中的列表按索引合并。看看这个小例子
const a = new List([{a: 1}, {a: 2}]);
const b = new List([{b: 3}, {b: 4}]);
const merged = a.merge(b);
console.log(merged.toJS())
// [{a: 1, b: 3}, {a: 2, b: 4}]
如果不想按索引合并,而是按特定标识符合并,则应将记录转移到地图中,并按alt字段键入:
请注意,您还需要使用mergeDeep使其对每个匹配的键进行递归嗯,您正在尝试将对象(第一组代码)与数组(第二组代码)合并。看起来您实际上想要将第一组代码中form.fields属性的值与第二组代码中的数组合并……您还需要告诉代码您想要在alt属性中匹配的代码。我建议阅读的答案了解更多信息。@MikeMcCaughan我试过list.mergefromJSerrors,fromJSform.form.fields;但我仍然得到一个空数组。刚刚看到你的第二条评论,正在查看。@MikeMcCaughan-hmm,它所做的似乎只是将两个数组组合起来,而不是将它们合并在一起。我不知道该怎么办。
import form from './json/form.json'
import config from './json/errors.json'
const formByField = form.reduce(
(total, field) => ({...total, [field.alt]: field}),
{}
);
const configByField = config.reduce(
(total, field) => ({...total, [field.alt]: field}),
{}
);
// then you can merge two Maps together
const result = new Map().mergeDeep(fromJS(formByField), fromJS(configByField));