Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/479.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用Lodash键将一个对象嵌套到另一个对象中_Javascript_Node.js - Fatal编程技术网

Javascript 使用Lodash键将一个对象嵌套到另一个对象中

Javascript 使用Lodash键将一个对象嵌套到另一个对象中,javascript,node.js,Javascript,Node.js,我有以下格式的事件数组: [ { "Id": 20862, "Date": "2019-12-13T00:00:00-08:00", "StartTime": 1576220400, "EndTime": 1576252800, "Slots": [...], "TotalTime": 8.5, "Cost": 0, "Area": 29, "P

我有以下格式的事件数组:

[
    {
        "Id": 20862,
        "Date": "2019-12-13T00:00:00-08:00",
        "StartTime": 1576220400,
        "EndTime": 1576252800,
        "Slots": [...],
        "TotalTime": 8.5,
        "Cost": 0,
        "Area": 29,
        "PersonId": 1,
        "Creator": 1,
        "Created": "2019-12-10T08:17:14-08:00",
        "Modified": "2019-12-11T06:11:18-08:00",
        "OnCost": 0,
        "StartTimeLocalized": "2019-12-13T09:00:00+02:00",
        "EndTimeLocalized": "2019-12-13T18:00:00+02:00",
        "ExternalId": null,
        "ConnectCreator": null,
        "AreaObject": {  ...  }
    }
]
还有另外一些人:

[ { Id: 1,
    DisplayName: 'Lex Luthor',
    ContactObject: { Email: 'lexl@dc.com' } },
  { Id: 406,
    DisplayName: 'Clark Kent',
    ContactObject: { Email: 'clarkk@dc.com' } } ]
我正在寻找一种通过PersonId属性将Person对象合并到Event对象的方法。 最后,我需要一系列事件,其中包含电子邮件地址和指定人员的姓名:

[
    {
        "Id": 20862,
        "Date": "2019-12-13T00:00:00-08:00",
        "StartTime": 1576220400,
        "EndTime": 1576252800,
        "Slots": [...],
        "TotalTime": 8.5,
        "Cost": 0,
        "Area": 29,
        "PersonId": 1,
        "Creator": 1,
        "Created": "2019-12-10T08:17:14-08:00",
        "Modified": "2019-12-11T06:11:18-08:00",
        "OnCost": 0,
        "StartTimeLocalized": "2019-12-13T09:00:00+02:00",
        "EndTimeLocalized": "2019-12-13T18:00:00+02:00",
        "ExternalId": null,
        "ConnectCreator": null,
        "AreaObject": {  ...  },
        "PersonObject":{ 
           Id: 1,
           DisplayName: 'Lex Luthor',
           ContactObject: { Email: 'lexl@dc.com' } }
         }
]
有没有办法用Lodash实现这一点?

你不需要Lodash

const all=[{
“Id”:20862,
“日期”:“2019-12-13T00:00:00-08:00”,
“开始时间”:1576220400,
“结束时间”:157652800,
“插槽”:[],
“总时间”:8.5,
“成本”:0,
“区域”:29,
“人格”:1,
“创造者”:1,
“已创建”:“2019-12-10T08:17:14-08:00”,
“修改”:“2019-12-11T06:11:18-08:00”,
“OnCost”:0,
“开始本地化”:“2019-12-13T09:00:00+02:00”,
“EndTimeLocalized”:“2019-12-13T18:00:00+02:00”,
“ExternalId”:null,
“ConnectCreator”:空,
“AreaObject”:{}
}];
康斯特人=[{
Id:1,
DisplayName:'Lex Luthor',
联系人对象:{
电邮:'lexl@dc.com'
}
},
{
身份证号码:406,
DisplayName:'Clark Kent',
联系人对象:{
电邮:'clarkk@dc.com'
}
}
];
const result=all.map(v=>({
v
PersonObject:people.find(p=>p.Id==v.PersonId)
}));
console.log('result',result)您可以使用。接线员,以及

试试这个:

let array1=[{“Id”:20862,“Date”:“2019-12-13T00:00:00-08:00”,“StartTime”:1576220400,“EndTime”:157622800,“slot”:[],“TotalTime”:8.5,“Cost”:0,“Area”:29,“PersonId”:1,“Creator”:1,“Created”:“Created”:“2019-12-10T08:17:14-08:00”,“Modified”:“2019-12-11T06:11:18-08:00”,“OnCost”:0,“StartTimeLocalized”:“2019-12-13T09:00+02:00”,“EndTimeLocalized”:“2019-12-13T18:00:00+02:00”,“ExternalId”:null,“ConnectCreator”:null,“AreaObject”:{}]
让array2=[{Id:1,DisplayName:'Lex Luthor',ContactObject:{Email:'lexl@dc.com“},{Id:406,显示名:'Clark Kent',联系人对象:{Email:'clarkk@dc.com' } }]
让res=array1.map((值,索引)=>{
返回{…value,PersonObject:(array2.find(x=>x.Id==value.PersonId))}
})

console.log(res);
对于这样一个简单的问题,我不会使用lodash。如果您不介意对原始对象进行变异,您可以使用
映射
来表示O(n)时间复杂度,以及
forEach
循环:

const events=[{Id:20862,日期:'2019-12-13T00:00:00-08:00',开始时间:1576220400,结束时间:157652800,时隙:[],TotalTime:8.5,Cost:0,Area:29,PersonId:1,Creator:1,Created:'2019-12-10T08:17:14-08:00',修改:'2019-12-11T06:11:18-08:00',OnCost:0,StartTimeLocalized:'2019-12-13T09:00+02:00',EndTimeLocalized:'2019-12-13T18:00+02:00',外部ID:null,ConnectCreator:null,AreaObject:{}]
const people=[{Id:1,DisplayName:'Lex Luthor',ContactObject:{Email:'lexl@dc.com“},{Id:406,显示名:'Clark Kent',联系人对象:{Email:'clarkk@dc.com' }}]
const map=newmap(people.map(p=>[p.Id,p]))
events.forEach(e=>e.PersonObject=map.get(e.PersonId))

console.log(events)
就我个人而言,我认为您可以使用纯JavaScript

我想提出一个科比答案的变体

如果你需要在数组中找到一个元素很多,你可能想考虑把你的数组转换成一个映射。 这里有一个小咖喱助手:

  • 指定搜索元素时要使用的键(请参见
    k
  • 将数组转换为映射(请参见
    .bind
constfindby=(k,xs)=>
((xs,v)=>xs.get(v))
.bind(null,新映射(xs.Map(x=>[x[k],x]));
您可以使用它构建专门的函数:
findPersonById

const findPersonById=findBy('Id',个人);
findPersonById(406);
//=>{Id:406
//=>,显示名称:'Clark Kent'
//=>,联系人对象:{电子邮件:'clarkk@dc.com' }
//=> }
然后,您只需映射
事件
数组:
(请注意,根据我在您的问题中的评论,我删除了
PersonId
,因为它已在
PersonObject
中提供)

constfindby=(k,xs)=>
((xs,v)=>xs.get(v))
.bind(null,新映射(xs.Map(x=>[x[k],x]));
const findPersonById=findBy('Id',个人);
console.log(
events.map({PersonId,…e})=>(
{…e
,PersonObject:findPersonById(PersonId)
}
))
);

常数事件=
[{“Id”:20862
,“日期”:“2019-12-13T00:00:00-08:00”
,“开始时间”:1576220400
,“结束时间”:157652800
,“插槽”:[]
,“总时间”:8.5
,“成本”:0
,“面积”:29
,“PersonId”:1
“创造者”:1
“已创建”:“2019-12-10T08:17:14-08:00”
,“修改”:“2019-12-11T06:11:18-08:00”
,“OnCost”:0
“开始本地化”:“2019-12-13T09:00:00+02:00”
,“EndTimeLocalized”:“2019-12-13T18:00:00+02:00”
,“ExternalId”:空
,“ConnectCreator”:空
,“AreaObject”:{}
}
];
康斯特人=
[{Id:1
,显示名称:'Lex Luthor'
,ContactObject:{Email:'lexl@dc.com' }
}
,
{Id:406
,显示名称:'Clark Kent'
,ContactObject:{Email:'clarkk@dc.com' }
}
];

Map的有趣用例;我喜欢它。但是我忍不住认为
e=>(e.PersonObject=Map.get(e.PersonId),e)
虽然它是一个很好的单行程序,但它也是“错误的”“在这一点上,对于读者来说,有两件事在起作用是绝对不明显的:注入一个新属性和返回对象。我将用一个命名函数tbh来消除混淆。不过还是很努力的。@customcommander我更喜欢使用map而不是find:P是的,为了简洁起见,我使用了逗号运算符,我不想使用排列,因为这真的是多余的。我不确定该函数的命名,但你说它不可读是对的。如果需要,可以添加一个编辑,显示如何使其可读:)I th