我有一个对象数组和一个原始值数组。我想创建一个新的对象数组,将第一个值映射到后者。
这里是对象数组:
var eventInstances = [
{
id: 1,
title: "Item 1"
},
{
id: 2,
title: "Item 2"
},
{
id: 1,
title: "Item 3"
},
{
id: 3,
title: "Item 4"
},
]
原始值数组:
var dates = [1, 2, 3]
我想将eventInstances
的对象映射到以dateInstances
的值作为键的新对象数组,这将与id
中的eventInstances
的值相对应
结果应为:
var dateInstances = [
{
id: 1,
instances: [
{
title: "Item 1"
},
{
title: "Item 1"
}
]
},
{
id: 2,
instances: [
{
title: "Item 1"
},
{
title: "Item 1"
}
]
},
{
id: 3,
instances: [
{
title: "Item 2"
}
]
}
];
对不起,如果这是一个新手问题,我一直在阅读排序方法,但在这里我很茫然。任何提示将不胜感激。谢谢!
答案 0 :(得分:5)
此功能将为您提供预期的结果。
dates.map(id=>{
return {id:id,
instances:eventInstances.filter(item =>{
return item.id === id;
})
.map(foundItem => {
return {title: foundItem.title}
})
}});
可能是一种更简单的方法,但这就是正在发生的事情。使用map
遍历日期数组。然后filter
在eventInstances中找到匹配的项目,然后再map
遍历这些项目以返回标题。
答案 1 :(得分:1)
您实际上不需要第二个数组,因为所有id
都可以在数据中找到。
您可以在由id
键控的地图中收集数据,然后提取值:
const eventInstances = [{id: 1,title: "Item 1"},{id: 2,title: "Item 2"},{id: 1,title: "Item 3"},{id: 3,title: "Item 4"}];
const map = new Map(eventInstances.map(({id}) => [id, {id, instances: []}]));
eventInstances.forEach(({id, title}) => map.get(id).instances.push({ title }));
const result = [...map.values()];
console.log(result);
这将根据数据创建一个Map
。 Map
使用其构造函数参数填充,该参数可以接受成对的数组作为输入。这样的一对将在构造的Map中用作键/值对。赋予构造函数的对如下所示:
[id, {id, instances: []}]
因此,Map
的键将设置为id
,其值将是{id, instances: []}
形式的对象。重复的id
值不会导致多余的输入...在过程中将被忽略。
下一步是forEach
循环,它将值放入这些instances
属性中。
最后,Map
的键已达到目的,现在可以弹出它们。我们只需要这些值,这些值就可以通过传播语法转换为数组。
答案 2 :(得分:-1)
我认为您正在寻找key
等于id
,而value
等于标题数组的对象,例如:
{
"0":[
"title1",
"title2"
],
"1":[
"title1",
"title2"
],
}
要实现这一点,您需要:
var dateInstances = {};
for(let i =0; i<eventInstances.length;i++){
if (!Array.isArray(dateInstances[eventInstances[i]["id"]])){
dateInstances[eventInstances[i]["id"]] = [];
}
dateInstances[eventInstances[i]["id"]].push(eventInstances[i]["id"]["title"]);
}