【问题标题】:Trying to combine two datasets where object key ids match尝试组合对象键 ID 匹配的两个数据集
【发布时间】:2020-08-24 12:18:19
【问题描述】:

我有两个数据集并一直在尝试将它们组合起来,但不知道从哪里开始。我正在进行两个 API 调用,下面是一个响应的小示例:

{
    early_game_items: {
        57: 16
        59: 60
        106: 1
        180: 54
        214: 28
        232: 6
    },
    late_game_items: {
        108: 1
        116: 1
    },
    mid_game_items: {
        1: 52
        102: 3
        108: 4
        116: 1
        193: 1
        194: 1
        223: 1
        232: 73
    }
}

另一个数据集编号从1 - 300ish,是由其他对象组成的对象。下面是一个sn-p:

const items = [{
            "id": 57,
            "name": "void_stone",
            "cost": 825,
            "secret_shop": 1,
            "side_shop": 0,
            "recipe": 0,
            "localized_name": "Void Stone"
        },
        {
            "id": 58,
            "name": "mystic_staff",
            "cost": 2700,
            "secret_shop": 1,
            "side_shop": 0,
            "recipe": 0,
            "localized_name": "Mystic Staff"
        },
        {
            "id": 59,
            "name": "energy_booster",
            "cost": 900,
            "secret_shop": 1,
            "side_shop": 0,
            "recipe": 0,
            "localized_name": "Energy Booster"
        }...]

我需要通过将第一个数据集中的键与第二个数据集中的 id 匹配,将第二个数据集中的数据放入第一个数据集中。例如:

{
    early_game_items: {
        57:  {amount: 16, name: 'void_stone', cost: 825}
        59:  {amount: 60...
        106: {amount: 1...
        180: {amount: 54...
        214: {amount: 28...
        232: {amount: 6...
    }... 

非常感谢您查看此内容!我是 js 新手,我真的很想学习。

【问题讨论】:

  • 第二个数据集长什么样子,是不是一个以数字为键的对象,像这样:{0: { id: 57, name: '', ... }, 1: { id : 58, ... }, ...} ?
  • @domenikk 很抱歉写得不好。我在第二个数据集中添加了更多内容。它们只是对象中的对象。我需要将第一个数据集中的键与第二个数据集中的 id 匹配
  • 在对象中不能有没有键的对象(或任何其他值),您所写的内容表明它们是数组的元素。请检查我的答案。
  • 我查看了您的解决方案,但项目未定义。它正在查找两个 ID,但没有将其保存到变量中。不知道发生了什么。我试图修复它但没有成功
  • 我已经修复了从 === 到 == 的比较

标签: javascript reactjs api object


【解决方案1】:

例如命名数据集 dataset1 和 dataset2 的另一个答案,并假设 dataset2 是一个对象数组。如果 dataset2 是大数组,这个答案有更好的性能:

let result = {};
// key = 'early_game_items', 'mid_game_items', 'late_game_items'
for(let key in dataset1) {
    result[key] = {}; 
    for(let id in dataset1[key]) {
        result[key][id] = { amount: dataset1[key][id] };
    }
}
for(let id in dataset2) {
   for(let key in dataset1) {
      let _item;
      if(_item=result[key][id]){
         const { name, cost } = dataset2[id];
         _item.name = name;
         _item.cost = cost;
      }
   }
}
console.log(result);

【讨论】:

  • 大声笑,你只是复制粘贴我的答案
【解决方案2】:

命名数据集 dataset1 和 dataset2,并假设 dataset2 是一个对象数组:

let result = {};

// key = 'early_game_items', 'mid_game_items', 'late_game_items'
for(let key in dataset1) {
    const itemGroup = dataset1[key];
    let _itemGroup = {}; 

    for(let id in itemGroup) {
        let _item = { amount: itemGroup[id] };
        // find item by id, in second dataset
        const item = dataset2.find(i => i.id == id) || {};
        // get name & cost via destructuring
        const { name, cost } = item;
        
        _item.name = name;
        _item.cost = cost;
        // store in new itemGroup
        _itemGroup[id] = _item;
    }
    // store in result
    result[key] = _itemGroup
}

console.log(result);

如果 dataset2 是一个以数字为键的对象,则需要修改“按 id 查找”功能:

// find item by id, in second dataset
const item = Object.values(dataset2).find(i => i.id === id) || {};

【讨论】:

    猜你喜欢
    • 2017-02-11
    • 2019-02-06
    • 2022-11-24
    • 1970-01-01
    • 1970-01-01
    • 2019-01-28
    • 2022-12-15
    • 1970-01-01
    相关资源
    最近更新 更多