Javascript 规范化数组中的对象,以便所有对象都包含相同的键集
我击中的端点返回一个对象数组,每个对象可能有一组字段,例如 常量字段=[ “id”, “头衔”, “贡献者”, “mediatype”, “来源” ] 但是,有些对象将只包含其中的一些字段,有些对象可能包含所有字段Javascript 规范化数组中的对象,以便所有对象都包含相同的键集,javascript,lodash,Javascript,Lodash,我击中的端点返回一个对象数组,每个对象可能有一组字段,例如 常量字段=[ “id”, “头衔”, “贡献者”, “mediatype”, “来源” ] 但是,有些对象将只包含其中的一些字段,有些对象可能包含所有字段 const items = [ { "id": 1, "title": "some title 1", "contributor": "bob", "mediatype": "text" }, { "id": 2, "tit
const items = [
{
"id": 1,
"title": "some title 1",
"contributor": "bob",
"mediatype": "text"
},
{
"id": 2,
"title": "some title 2",
"mediatype": "text"
}.
{
"id": 3,
"title": "some title 3",
"mediatype": "movies"
"source": "comcast"
}
]
我想规范化所有的对象,这样每个对象都包含每个期望的字段,用null或一些虚假的值来填补空白,这样我打算最终将其输入的graphql是满意的
const items = [
{
"id": 1,
"title": "some title 1",
"contributor": "bob",
"mediatype": "text",
"source": null
},
{
"id": 2,
"title": "some title 2",
"mediatype": "text",
"contributor": null,
"source": null
}.
{
"id": 3,
"title": "some title 3",
"mediatype": "movies",
"contributor": null,
"source": "comcast"
}
]
我讨厌的代码看起来像这样
const normalize = items =>
items.map(item => {
FIELDS.forEach(f => {
if (!item[f]) {
item[f] = null;
}
});
return item;
});
有什么建议可以更优雅地写这篇文章吗?可以用vanilla JS,也可以用lodash,因为我的代码库中已经有了这篇文章,我同样愿意使用它。你的if!项[f]测试将匹配任何值,这可能不是您想要的
相反,您应该适当地,例如:
如果!f在项目中,不确定这是否真的更好。。。但这里有一些等价的替代语法 使用equals本身或null来挤出更多的糖:
const normalize = items =>
items.map(item => {
FIELDS.forEach(f => item[f] = item[f] || null);
return item;
});
或者用这句话来测试每个人的耐心:
const normalize = items =>
items.map(item => FIELDS.reduce((acc, field) => {acc[field] = item[field] || null; return acc}, item));
您可以选择。您可以使用扩展语法,但最好将字段定义为模板对象:
const FIELDS = {
id: null,
title: null,
contributor: null,
mediatype: null,
source: null
};
const normalize = items => items.map(item => ({...FIELDS, ...item}));
在我看来,这是最好的主意