Javascript 规范化数组中的对象,以便所有对象都包含相同的键集

Javascript 规范化数组中的对象,以便所有对象都包含相同的键集,javascript,lodash,Javascript,Lodash,我击中的端点返回一个对象数组,每个对象可能有一组字段,例如 常量字段=[ “id”, “头衔”, “贡献者”, “mediatype”, “来源” ] 但是,有些对象将只包含其中的一些字段,有些对象可能包含所有字段 const items = [ { "id": 1, "title": "some title 1", "contributor": "bob", "mediatype": "text" }, { "id": 2, "tit

我击中的端点返回一个对象数组,每个对象可能有一组字段,例如

常量字段=[ “id”, “头衔”, “贡献者”, “mediatype”, “来源” ] 但是,有些对象将只包含其中的一些字段,有些对象可能包含所有字段

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

在我看来,这是最好的主意