Arrays 从csv重新构造json
我得到了一个csv文件,我得到了这个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
[{
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%的工作,这里将主要分享如何减少部分