如何从另一个对象中提取对象?

时间:2019-03-05 15:49:46

标签: javascript lodash

我有这个数组对象,并且我试图用它创建另一个对象。我已经有一个解决方案,但是我认为做我正在做的事情可能会有更短的方法。有谁知道如何使用lodash或纯JavaScript使这段代码更短或更短?提前非常感谢!

{
 firstName: Mike,
 lastName : Brown
}

到目前为止,我的代码可以正常运行,如下所示:

let response =     [
     {
	 "Name": "hobby",
	 "Value": "poker"
    }, 
    {
	 "Name": "privacy_id",
	 "Value": "1112"
    }, {
	 "Name": "given_name",
	 "Value": "Mike"
    }, 
    {
	 "Name": "family_name",
	 "Value": "Brown"
    }, 
    {
	 "Name": "email",
	 "Value": "test@email.com"
    }
 ]
 
 const newObj = {};
 _.forEach(response, function(obj) {
       if(obj.Name === 'given_name') { newObj.firstName = obj.Value}
       if(obj.Name === 'family_name'){ newObj.lastName = obj.Value}
  });
  
  console.log(newObj);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>

2 个答案:

答案 0 :(得分:1)

这是Array.prototype.reduce的好用例,因为您想要的是将数组转换为某种东西-在您的情况下,某种东西成为对象:

const newObj = response.reduce((acc, curr) => {
  acc[curr.Name] = curr.Value;
  return acc;
}, {});

这将改变:

const response = [
  {
    'Name': 'given_name',
    'Value': 'Mike'
  },
  {
    'Name': 'family_name',
    'Value': 'Brown'
  }
]

进入:

{
  'given_name': 'Mike',
  'family_name': 'Brown'
}

现在,如果要更改键的命名,则可以使用某种映射:

const NameMapping = {
  given_name: 'firstName',
  family_name: 'lastName'
};

const response = [
  {
    'Name': 'given_name',
    'Value': 'Mike'
  },
  {
    'Name': 'family_name',
    'Value': 'Brown'
  }
]

const newObj = response.reduce((acc, curr) => {
  if (NameMapping[curr.Name] === undefined)
    return acc;

  acc[NameMapping[curr.Name]] = curr.Value;
  return acc;
}, {});

所以您的newObj看起来像这样:

{
  firstName: 'Mike',
  familyName: 'Brown'
}

答案 1 :(得分:1)

如果您确定response包含键为given_name的对象和键为family_name的对象,则可以这样写:

const newObj = {
    'given_name': response.filter(el => el.Name ==='given_name')[0].Value,
    'family_name': response.filter(el => el.Name ==='family_name')[0].Value,
}

有小提琴:

let response =     [
     {
	 "Name": "hobby",
	 "Value": "poker"
    }, 
    {
	 "Name": "privacy_id",
	 "Value": "1112"
    }, {
	 "Name": "given_name",
	 "Value": "Mike"
    }, 
    {
	 "Name": "family_name",
	 "Value": "Brown"
    }, 
    {
	 "Name": "email",
	 "Value": "test@email.com"
    }
 ]
 
 const newObj = {
    'given_name': response.filter(el => el.Name ==='given_name')[0].Value,
    'family_name': response.filter(el => el.Name ==='family_name')[0].Value,
 }
  
 console.log(newObj);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>