【问题标题】:Assign values of object on another array in JavaScript在 JavaScript 中为另一个数组分配对象的值
【发布时间】:2019-08-07 00:12:18
【问题描述】:

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

这是对象数组:

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 的值作为键,这将与eventInstancesid 的值相对应。

结果应该是:

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

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

【问题讨论】:

  • 还请附上您迄今为止编写的任何代码以自己解决问题。
  • 您想要的输出不是有效的 JavaScript 表示法。
  • @trincot 感谢您的评论,现在应该是正确的。

标签: javascript arrays sorting object javascript-objects


【解决方案1】:

这个函数会给你预期的结果。

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

【讨论】:

  • 哇,谢谢!我似乎完全错误地理解了地图和过滤器的整个概念。我想我现在终于可以把头绕过去了。效果很好。
【解决方案2】:

您实际上不需要第二个数组,因为所有这些 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 的键将设置为ids,其值将是{id, instances: []} 形式的对象。重复的id 值不会导致额外的条目...它们将在此过程中被忽略。

下一步是forEach 循环,它将值放入那些instances 属性中。

最后,Map 的键已经发挥了作用,现在可以弹出它们了。我们只需要值,通过扩展语法将其转换为数组。

【讨论】:

  • 谢谢!它完美地工作并且确实使代码更加简洁。在我将所有日期作为时间戳从 JSON 源推送到数组之前,然后存储为 Set 并再次转换为数组。您的代码究竟在哪里创建了一组唯一值?我看到它有效,但我不明白魔法发生在哪里。
  • 啊,是的,但看起来你的直觉是朝着正确的方向发展的:MapSet 没有太大区别,除了获得唯一键(日期)之外,您还可以链接以同样的努力与他们相关的数据。
  • 我在回答中添加了一些解释。
  • 感谢您的澄清,这真的很有帮助!
【解决方案3】:

我认为您正在寻找一个对象,其中key 等于idvalue 等于一个标题数组,例如:

{
    "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"]);

}

【讨论】:

    猜你喜欢
    • 2019-07-04
    • 2019-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-16
    • 2023-01-11
    • 1970-01-01
    相关资源
    最近更新 更多