JavaScript ES6 中的对象文字 - 将大对象解构为较小对象的语法糖?
JavaScript object literals and ES6 - syntatic sugar to deconstruct large object into smaller ones?
我想知道的是;有没有更简单的语法快捷方式来实现我在这里尝试做的事情。
我在一个循环中有一个大的 JSON 对象,像这样:
let line = {
first_name: ...,
last_name: ...,
title: ...,
email: ...,
facebook_account: ...,
linkedin_account: ...,
twitter_account: ...,
instagram_account: ...,
snapchat_account: ...
};
然后我将这个有效载荷分解成更小的对象:
let profile = {
first_name: line.first_name,
last_name: line.last_name,
title: line.title,
email: line.email
};
let social = {
facebook_account: line.facebook_account,
linkedin_account: line.linkedin_account,
twitter_account: line.twitter_account,
instagram_account: line.instagram_account,
snapchat_account: line.snapchat_account
};
ES6 是否为我提供了一种方法来减少每个 属性 的重复,即 first_name、facebook_account 等? 属性 名称在分解方式方面不一定很明显 - 它基于我们的数据模型。
这是大量重复的手动工作。我想知道我是否遗漏了一些 ES6 魔法,或者其他什么东西,那就太棒了。我并不是真的在寻找带有机器学习算法的超级聪明的递归循环……如果可能的话,只是更短的语法。 :)
您可以使用对象析构:
let {variables} = obj
和单个变量赋值:
let obj2 = { variables }
变量可以是多个,用逗号分隔。
析构时:let {name, date, whatever} = obj;
并且分配时:let obj2 = { name, date, whatever }
let line = {
first_name: "Zak",
last_name: "Frisch",
title: "my Title",
email: "myemail@whatever",
facebook_account: "fb",
linkedin_account: "li",
twitter_account: "tweet",
instagram_account: "ia",
snapchat_account: "sc"
};
let {first_name, last_name, title, email, facebook_account, linkedin_account, twitter_account, instagram_account, snapchat_account} = line;
let profile = {
first_name,
last_name,
title,
email
};
let social = {
facebook_account,
linkedin_account,
twitter_account,
instagram_account,
snapchat_account
};
console.log(profile, social);
根据答案,你可以这样做:
let line = {
first_name: "Zak",
last_name: "Frisch",
title: "my Title",
email: "myemail@whatever",
facebook_account: "fb",
linkedin_account: "li",
twitter_account: "tweet",
instagram_account: "ia",
snapchat_account: "sc"
};
let profile = Object.keys(line).reduce(function(obj, k) {
if (!k.endsWith('_account')) obj[k] = line[k];
return obj;
}, {});
let social = Object.keys(line).reduce(function(obj, k) {
if (k.endsWith('_account')) obj[k] = line[k];
return obj;
}, {});
console.log(line);
console.log(profile);
console.log(social);
我想知道的是;有没有更简单的语法快捷方式来实现我在这里尝试做的事情。
我在一个循环中有一个大的 JSON 对象,像这样:
let line = {
first_name: ...,
last_name: ...,
title: ...,
email: ...,
facebook_account: ...,
linkedin_account: ...,
twitter_account: ...,
instagram_account: ...,
snapchat_account: ...
};
然后我将这个有效载荷分解成更小的对象:
let profile = {
first_name: line.first_name,
last_name: line.last_name,
title: line.title,
email: line.email
};
let social = {
facebook_account: line.facebook_account,
linkedin_account: line.linkedin_account,
twitter_account: line.twitter_account,
instagram_account: line.instagram_account,
snapchat_account: line.snapchat_account
};
ES6 是否为我提供了一种方法来减少每个 属性 的重复,即 first_name、facebook_account 等? 属性 名称在分解方式方面不一定很明显 - 它基于我们的数据模型。
这是大量重复的手动工作。我想知道我是否遗漏了一些 ES6 魔法,或者其他什么东西,那就太棒了。我并不是真的在寻找带有机器学习算法的超级聪明的递归循环……如果可能的话,只是更短的语法。 :)
您可以使用对象析构:
let {variables} = obj
和单个变量赋值:
let obj2 = { variables }
变量可以是多个,用逗号分隔。
析构时:let {name, date, whatever} = obj;
并且分配时:let obj2 = { name, date, whatever }
let line = {
first_name: "Zak",
last_name: "Frisch",
title: "my Title",
email: "myemail@whatever",
facebook_account: "fb",
linkedin_account: "li",
twitter_account: "tweet",
instagram_account: "ia",
snapchat_account: "sc"
};
let {first_name, last_name, title, email, facebook_account, linkedin_account, twitter_account, instagram_account, snapchat_account} = line;
let profile = {
first_name,
last_name,
title,
email
};
let social = {
facebook_account,
linkedin_account,
twitter_account,
instagram_account,
snapchat_account
};
console.log(profile, social);
根据
let line = {
first_name: "Zak",
last_name: "Frisch",
title: "my Title",
email: "myemail@whatever",
facebook_account: "fb",
linkedin_account: "li",
twitter_account: "tweet",
instagram_account: "ia",
snapchat_account: "sc"
};
let profile = Object.keys(line).reduce(function(obj, k) {
if (!k.endsWith('_account')) obj[k] = line[k];
return obj;
}, {});
let social = Object.keys(line).reduce(function(obj, k) {
if (k.endsWith('_account')) obj[k] = line[k];
return obj;
}, {});
console.log(line);
console.log(profile);
console.log(social);