Arrays 从csv重新构造json

Arrays 从csv重新构造json,arrays,json,lodash,Arrays,Json,Lodash,我得到了一个csv文件,我得到了这个 [{ first_name: 'account#1', last_name: 'lastname#1', email: 'first@email.com', category: 'category_a', level_of_experience: '1-2 years', type: 'media_type_a', price: 'price_for_media_type_a', work_sample: 'sample_fo

我得到了一个csv文件,我得到了这个

[{
  first_name: 'account#1',
  last_name: 'lastname#1',
  email: 'first@email.com',
  category: 'category_a',
  level_of_experience: '1-2 years',
  type: 'media_type_a',
  price: 'price_for_media_type_a',
  work_sample: 'sample_for_media_type_a_1'
}, {
  first_name: 'account#1',
  last_name: 'lastname#1',
  email: 'first@email.com',
  category: 'category_a',
  level_of_experience: '1-2 years',
  type: 'media_type_a',
  price: 'price_for_media_type_a',
  work_sample: 'sample_for_media_type_a_2'
}, {
  first_name: 'account#1',
  last_name: 'lastname#1',
  email: 'first@email.com',
  category: 'category_a',
  level_of_experience: '1-2 years',
  type: 'media_type_b',
  price: 'price_for_media_type_b',
  work_sample: 'sample_for_media_type_b_1'
}, {
  first_name: 'account#1',
  last_name: 'lastname#1',
  email: 'first@email.com',
  category: 'category_a',
  level_of_experience: '1-2 years',
  type: 'media_type_b',
  price: 'price_for_media_type_b',
  work_sample: 'sample_for_media_type_b_2'
}, {
  first_name: 'account#1',
  last_name: 'lastname#1',
  email: 'first@email.com',
  category: 'category_b',
  level_of_experience: '3-5 years',
  type: 'media_type_c',
  price: 'price_for_media_type_c',
  work_sample: 'sample_for_media_type_c_1'
}, {
  first_name: 'account#1',
  last_name: 'lastname#1',
  email: 'first@email.com',
  category: 'category_b',
  level_of_experience: '3-5 years',
  type: 'media_type_c',
  price: 'price_for_media_type_c',
  work_sample: 'sample_for_media_type_c_1'
}, {
  first_name: 'account#1',
  last_name: 'lastname#1',
  email: 'first@email.com',
  category: 'category_b',
  level_of_experience: '3-5 years',
  type: 'media_type_d',
  price: 'price_for_media_type_d',
  work_sample: 'sample_for_media_type_d_1'
}, {
  first_name: 'account#1',
  last_name: 'lastname#1',
  email: 'first@email.com',
  category: 'category_b',
  level_of_experience: '3-5 years',
  type: 'media_type_d',
  price: 'price_for_media_type_d',
  work_sample: 'sample_for_media_type_d_2'
}, {
  first_name: 'account#2',
  last_name: 'lastname#2',
  email: 'second@email.com',
  category: 'category_c',
  level_of_experience: '1-2 years',
  type: 'media_type_ab',
  price: 'price_for_media_type_ab',
  work_sample: 'sample_for_media_type_ab_1'
}, {
  first_name: 'account#2',
  last_name: 'lastname#2',
  email: 'second@email.com',
  category: 'category_c',
  level_of_experience: '1-2 years',
  type: 'media_type_ab',
  price: 'price_for_media_type_ab',
  work_sample: 'sample_for_media_type_ab_2'
}, {
  first_name: 'account#2',
  last_name: 'lastname#2',
  email: 'second@email.com',
  category: 'category_c',
  level_of_experience: '1-2 years',
  type: 'media_type_cd',
  price: 'price_for_media_type_cd',
  work_sample: 'sample_for_media_type_cd_1'
}, {
  first_name: 'account#2',
  last_name: 'lastname#2',
  email: 'second@email.com',
  category: 'category_c',
  level_of_experience: '1-2 years',
  type: 'media_type_cd',
  price: 'price_for_media_type_cd',
  work_sample: 'sample_for_media_type_cd_2'
}, {
  first_name: 'account#2',
  last_name: 'lastname#2',
  email: 'second@email.com',
  category: 'category_d',
  level_of_experience: '3-5 years',
  type: 'media_type_ef',
  price: 'price_for_media_type_ef',
  work_sample: 'sample_for_media_type_ef_1'
}, {
  first_name: 'account#2',
  last_name: 'lastname#2',
  email: 'second@email.com',
  category: 'category_d',
  level_of_experience: '3-5 years',
  type: 'media_type_ef',
  price: 'price_for_media_type_ef',
  work_sample: 'sample_for_media_type_ef_1'
}, {
  first_name: 'account#2',
  last_name: 'lastname#2',
  email: 'second@email.com',
  category: 'category_d',
  level_of_experience: '3-5 years',
  type: 'media_type_gh',
  price: 'price_for_media_type_gh',
  work_sample: 'sample_for_media_type_gh_1'
}, {
  first_name: 'account#2',
  last_name: 'lastname#2',
  email: 'second@email.com',
  category: 'category_d',
  level_of_experience: '3-5 years',
  type: 'media_type_gh',
  price: 'price_for_media_type_gh',
  work_sample: 'sample_for_media_type_gh_2'
}]
通过将lodashmap、groupby和reduce结合起来,我成功地解决了这个问题

[{
  "first_name": "account#1",
  "last_name": "lastname#1",
  "email": "first@email.com",
  "details": {
    "portfolio": {
      "category_data": {
        "category_a": {
          "portfolio_type_data": {
            "media_type_a": {
              "cost": "price_for_media_type_a",
              "sample_file": [
                null,
                null,
                null,
                null,
                null,
                null,
                null,
                null
              ]
            },
            "media_type_b": {
              "cost": "price_for_media_type_a",
              "sample_file": [
                null,
                null,
                null,
                null,
                null,
                null,
                null,
                null
              ]
            },
            "media_type_c": {
              "cost": "price_for_media_type_a",
              "sample_file": [
                null,
                null,
                null,
                null,
                null,
                null,
                null,
                null
              ]
            },
            "media_type_d": {
              "cost": "price_for_media_type_a",
              "sample_file": [
                null,
                null,
                null,
                null,
                null,
                null,
                null,
                null
              ]
            }
          }
        },
        "category_b": {
          "portfolio_type_data": {
            "media_type_a": {
              "cost": "price_for_media_type_a",
              "sample_file": [
                null,
                null,
                null,
                null,
                null,
                null,
                null,
                null
              ]
            },
            "media_type_b": {
              "cost": "price_for_media_type_a",
              "sample_file": [
                null,
                null,
                null,
                null,
                null,
                null,
                null,
                null
              ]
            },
            "media_type_c": {
              "cost": "price_for_media_type_a",
              "sample_file": [
                null,
                null,
                null,
                null,
                null,
                null,
                null,
                null
              ]
            },
            "media_type_d": {
              "cost": "price_for_media_type_a",
              "sample_file": [
                null,
                null,
                null,
                null,
                null,
                null,
                null,
                null
              ]
            }
          }
        }
      }
    }
  }
}, {
  "first_name": "account#2",
  "last_name": "lastname#2",
  "email": "second@email.com",
  "details": {
    "portfolio": {
      "category_data": {
        "category_c": {
          "portfolio_type_data": {
            "media_type_ab": {
              "cost": "price_for_media_type_ab",
              "sample_file": [
                null,
                null,
                null,
                null,
                null,
                null,
                null,
                null
              ]
            },
            "media_type_cd": {
              "cost": "price_for_media_type_ab",
              "sample_file": [
                null,
                null,
                null,
                null,
                null,
                null,
                null,
                null
              ]
            },
            "media_type_ef": {
              "cost": "price_for_media_type_ab",
              "sample_file": [
                null,
                null,
                null,
                null,
                null,
                null,
                null,
                null
              ]
            },
            "media_type_gh": {
              "cost": "price_for_media_type_ab",
              "sample_file": [
                null,
                null,
                null,
                null,
                null,
                null,
                null,
                null
              ]
            }
          }
        },
        "category_d": {
          "portfolio_type_data": {
            "media_type_ab": {
              "cost": "price_for_media_type_ab",
              "sample_file": [
                null,
                null,
                null,
                null,
                null,
                null,
                null,
                null
              ]
            },
            "media_type_cd": {
              "cost": "price_for_media_type_ab",
              "sample_file": [
                null,
                null,
                null,
                null,
                null,
                null,
                null,
                null
              ]
            },
            "media_type_ef": {
              "cost": "price_for_media_type_ab",
              "sample_file": [
                null,
                null,
                null,
                null,
                null,
                null,
                null,
                null
              ]
            },
            "media_type_gh": {
              "cost": "price_for_media_type_ab",
              "sample_file": [
                null,
                null,
                null,
                null,
                null,
                null,
                null,
                null
              ]
            }
          }
        }
      }
    }
  }
}]
而我希望它是这样的

{  
  "first_name":"account#1",
  "last_name":"lastname#1",
  "details":{  
     "portfolio":{  
        "category_data":{
          ...
           "category_a":{         
              ...
              "portfolio_type_data":{  
                 "media_type_a":{  
                    "price":"price_for_media_type_a",
                    "sample_file":["sample_for_media_type_a_1", "sample_for_media_type_a_2"]
                 },
                 "media_type_b":{  
                    "price":"price_for_media_type_b",
                    "sample_file":["sample_for_media_type_b_1", "sample_for_media_type_b_2"]
                 }
              }
              ...
           },
           "category_b":{         
              ...
              "portfolio_type_data":{  
                 "media_type_c":{  
                    "price":"price_for_media_type_c",
                    "sample_file":["sample_for_media_type_c_1", "sample_for_media_type_c_2"]
                 },
                 "media_type_d":{  
                    "price":"price_for_media_type_d",
                    "sample_file":["sample_for_media_type_d_1", "sample_for_media_type_d_2"]
                 }
              }
              ...
           },
        }
     }
  }
}

这是我的

我认为重构并在一次迭代中完成是有意义的(基本上就像@toastal建议的那样)。 以下是你如何用一些lodash魔法来实现这一点

让reducedData=\减少(csvData,(memo,value)=>{
让用户信息={
first\u name:value.first\u name,
姓氏:value.last\u name,
电子邮件:value.email,
经验等级:价值。经验等级
};
//搜索用户信息,如果未找到,则推入备忘录
让user=\查找(memo,userInfo);
如果(!用户){
memo.push(userInfo);
用户=用户信息;
}
//与公文包类型相同的技巧。Lodash允许使用u.get调用检查嵌套路径
const typePropertyPath=`details.portfolio.category_data.${value.category}.portfolio_type_data.${value.type}`;
让typeData=u2;.get(用户,typePropertyPath);
if(类型数据){
typeData.sample\u file.push(value.work\u sample);
}否则{
//未找到时设置(lodash负责嵌套)
_.set(用户,类型属性路径{
价格:价值,
样本文件:[value.work\u样本]
});
}
返回备忘录;

}, []);神圣的莫利人。。。为了提高效率,您不想在所有数据上循环那么多次。@toastal我知道,我被冲昏头脑了,我知道一定有更简单的方法可以做到这一点,我还没有想出来,虽然您不会喜欢它,但由于数据结构正在从平面变为嵌套,这可能需要在一个包含空对象的大型reduce中构建。循环并处理数据一次,然后在第一次循环时将所有内容存储起来。@toastal我明白你的意思了。这是一个遗留项目,我必须参与其中,我们实际上正在对整个项目进行重大重组,只需要注意使用我们现有的数据,这就是你在上面看到的。无论如何,我想我现在已经完成了95%的工作,这里将主要分享
如何减少
部分