Javascript 如何根据值合并两个不同长度的对象

Javascript 如何根据值合并两个不同长度的对象,javascript,arrays,ecmascript-6,lodash,ecmascript-5,Javascript,Arrays,Ecmascript 6,Lodash,Ecmascript 5,我有两个对象数组,两个数组都包含键和值对。我的目标是,如果一个键name的字符串值与另一个键\u id的字符串值匹配,则将键值从一个数组分配到第二个数组 我已经尝试将两个数组组合成一个数组,并且只使用一个数组和对象,但是我仍然不确定如何根据key\u id和name的匹配值将key和value分配给其他对象。我知道如何使用同一个键,但我们如何基于不同的键和相同的值来执行它? 这可能是糟糕的设计和实践,但数据就是这样回来的。这可行吗?我尝试过使用lodash、spread操作和map,但没有成功

我有两个对象数组,两个数组都包含键和值对。我的目标是,如果一个键
name
的字符串值与另一个键
\u id
的字符串值匹配,则将键值从一个数组分配到第二个数组

我已经尝试将两个数组组合成一个数组,并且只使用一个数组和对象,但是我仍然不确定如何根据key
\u id
name
的匹配值将key和value分配给其他对象。我知道如何使用同一个键,但我们如何基于不同的键和相同的值来执行它? 这可能是糟糕的设计和实践,但数据就是这样回来的。这可行吗?我尝试过使用lodash、spread操作和map,但没有成功

arr1 = [
{"_id": "electronics", "number": 35 },
{"_id": "house Appliances", "number": 5 },
{"_id": "nothing", "number":0}
]

arr2 = [
{"name": "electronics", "purpose": "entertainment", "price": 100},
{"name": "house Appliances", "purpose": "general", "price": 200},
{"name": "watches", "purpose": "time", "price": 30} ]

combinedArrObj = [
{"name": "electronics", "number": 35, "purpose": "entertainment", "price": 100},
{"name": "house Appliances", "purpose": "general", "price": 200, "number": 5}, 
{"name": "watches", "purpose": "time", "price": 30}
 ]

您可以使用reduce和find

  • 首先检查对应名称的
    arr1
    中是否存在任何匹配的
    \u id
  • 如果存在,则在最终输出中合并该元素的值
  • 否则只需在输出中保留
    inp
let arr1=[{“\u id”:“电子”,“数字”:35},“\u id”:“家用电器”,“数字”:5}]
让arr2=[{“名称”:“电子”,“用途”:“娱乐”,“价格”:100},{“名称”:“家用电器”,“用途”:“一般”,“价格”:200},{“名称”:“手表”,“用途”:“时间”,“价格”:30}]
让final=arr2.reduce((op,inp)=>{
let found=arr1.find(({u id})=>\u id==inp.name)
让name=inp.name
op[name]=op[name]| |{}
如果(找到){
让{u id,…rest}=找到
op[name]={…op[name],…rest,…inp}
}否则{
op[name]={…op[name],…inp}
}
返回操作
},{})
console.log(final)
创建一个函数,用于将每个数组转换为对象,并将其各自的标识符(
\u id
name
)作为键(with),然后将其转换为单个对象。当
\u id
字段:

const{flow,partiOK:pr,overArgs,merge,keyBy,map,omit}=_
const combineArrays=流量(
overArgs((…objs)=>merge({},…objs)[
arr1=>keyBy(arr1,'.'u id'),
arr2=>keyBy(arr2,'name')
]),
pr(map,o=>省略(o,'.'u id'))
)
const arr1=[{“\u id”:“电子”,“数字”:35},{“\u id”:“家用电器”,“数字”:5}]
const arr2=[{“名称”:“电子”,“用途”:“娱乐”,“价格”:100},{“名称”:“家用电器”,“用途”:“一般”,“价格”:200},{“名称”:“手表”,“用途”:“时间”,“价格”:30}]
const combinedars=combineArrays(arr1,arr2)
console.log(combinedArrs)

在我看来,如果在
数组1
中只有一个
键值
对,则无需过度复杂化。只需将其转换为地图,然后通过
array2
创建无lodash的合并等

const arr1=[{“\u id”:“电子”,“数字”:35},{“\u id”:“家用电器”,“数字”:5}]
const arr2=[{“名称”:“电子”,“用途”:“娱乐”,“价格”:100},{“名称”:“家用电器”,“用途”:“一般”,“价格”:200},{“名称”:“手表”,“用途”:“时间”,“价格”:30}]
设map=arr1.reduce((acc,{u id,number})=>(acc[\u id]=number,acc),{})
让result=arr2.map(({name,…rest})=>
赋值({name},rest,map[name]?{number:map[name]}:{}))
console.log(结果)