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);