在JavaScript中的另一个数组上分配对象的值

时间:2019-03-15 21:05:21

标签: javascript arrays sorting object javascript-objects

我有一个对象数组和一个原始值数组。我想创建一个新的对象数组,将第一个值映射到后者。

这里是对象数组:

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"
      }
    ]
  }
];

对不起,如果这是一个新手问题,我一直在阅读排序方法,但在这里我很茫然。任何提示将不胜感激。谢谢!

3 个答案:

答案 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遍历这些项目以返回标题。

Array.map docs

Array.filter docs

答案 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);

这将根据数据创建一个MapMap使用其构造函数参数填充,该参数可以接受成对的数组作为输入。这样的一对将在构造的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"]);

}