Javascript 合并两个对象并通过添加新键增强结果

Javascript 合并两个对象并通过添加新键增强结果,javascript,object,functional-programming,Javascript,Object,Functional Programming,目前我有两个对象(一个是JSON模式,另一个是来自API的响应),我希望合并它们以更好地映射和使用 架构如下所示: // schema { key: { description: "foo", properties: { values: { title: "foo", type: "Array" }, type: "string"

目前我有两个对象(一个是JSON模式,另一个是来自API的响应),我希望合并它们以更好地映射和使用

架构如下所示:

// schema
{
  key: {
    description: "foo", 
    properties: {
      values: {
        title: "foo",
        type: "Array"
      },
      type: "string"
    },
    type: "object"
  },
  foo: {
    title: "title",
    description: "bar"
  },
  bar: {
    title: "title",
    description: "who"
  }
}
我的响应对象与此类似:

// response
{
  key: {
    values: [0, 1]
    type: "point"
  },
  foo: null,
  bar: "some string"
}
我只想合并这两个对象,但是使用
constmergedobject={…schema,…response}
将导致重写这些值

因此,我想要的结果将包含一个名为
value
的新对象属性,或者包含
响应
对象的值的东西:

{
  key: {
    value: {
      values: [0, 1],
      type: "point",
    },
    description: "foo", 
    properties: {
      values: {
        title: "foo",
        type: "Array"
      },
      type: "string"
    },
    type: "object"
  },
  foo: {
    value: null,
    title: "title",
    description: "bar"
  },
  bar: {
    value: "some string",
    title: "title",
    description: "who"
  }
}
使用spread运算符是否可行?我在这里找不到合适的解决方案,因为lodash
assign
assignIn
也不提供该功能

我也尝试过这个功能:

function merge (...objs) =>
  [...objs].reduce(
    (acc, obj) =>
      Object.keys(obj).reduce((a, k) => {
        acc[k] = acc.hasOwnProperty(k) ? [].concat(acc[k]).concat(obj[k]) : obj[k];
        return acc;
      }, {}),
    {}
  );
但它给了我

{
  bar: [
    {
      title: "title",
      description: "who"
    },
    "some string",
  ],
  foo: [
    {
      title: "title",
      description: "bar",
    },
    null
  ],
  key: [
    {
      description: "foo", 
      properties: {
        values: {
          title: "foo",
          type: "Array"
        },
        type: "string"
      },
      type: "object"
    },
    {
      values: [0, 1]
      type: "point"
    }
  ]
}
这也不是我想要的


感谢您的帮助,谢谢

你需要调查一下

const数据={
关键:{
描述:'foo',
特性:{
价值观:{
标题:"富",,
键入:“数组”,
},
键入:“字符串”,
},
类型:“对象”,
},
傅:{
标题:“标题”,
描述:'bar',
},
酒吧:{
标题:“标题”,
描述:'谁',
},
};
常数res={
关键:{
值:[0,1],
键入:“点”,
},
foo:null,
酒吧:“一些字符串”,
};
常量输出={…数据};
Object.keys(res.forEach)(r)=>{
常量isPresent=!!(数据[r]);
如果(显示){
常数响应值=res[r];
输出[r]={responseValues,…数据[r]};
}否则{
输出[r]=res[r];
}
});
控制台日志(输出)您可以组合和:
const objA={
关键:{
描述:“foo”,
特性:{
价值观:{
标题:“富”,
类型:“数组”
},
类型:“字符串”
},
类型:“对象”
},
傅:{
标题:“标题”,
说明:“酒吧”
},
酒吧:{
标题:“标题”,
描述:“谁”
}
}
常数objB={
关键:{
值:[0,1],
类型:“点”
},
foo:null,
酒吧:“一些字符串”
}
函数合并对象(objectA、objectB){
const mergedObject={};
Object.key(objectA.forEach)(key)=>{
合并对象[键]={
…对象A[键],
值:objectB[key]的类型=='object'&&objectB[key]!==null
?{…objectB[key]}
:objectB[键]
}
})
返回合并对象;
}
log(合并对象(objA,objB))