重构对象数组

时间:2019-02-14 08:38:13

标签: javascript ecmascript-6

下面的代码将输入作为对象数组,我想转换成其他格式。

下面的代码可以正常工作,但是我需要一种更短的重构格式,以实现自己的目标。

var res =  {"matchObject":"{\"data\":[{\"id\":\"jack1\",\"firstname\":\"jack\",\"lastname\":\"hudson\",\"dob\":\"1990-01-01T00:00:00.000Z\",\"email\":\"jack1@yahoo.com\",\"phone\":null,\"orgid\":\"001\"},{\"id\":\"jack2\",\"firstname\":\"Jack\",\"lastname\":\"Clinton\",\"dob\":\"1991-01-01T00:00:00.000Z\",\"email\":\"jack.clinton@yahoo.com\",\"phone\":\"+16464922600\",\"orgid\":\"002\"}]}"};
var parsedObj = JSON.parse(res.matchObject);

var res = [];
for(var key in parsedObj.data){
    var emailObj = {};
    var phoneObj = {}
    if(parsedObj.data[key].email !== null){
        emailObj.matchedRes = parsedObj.data[key].email;
        emailObj.id = parsedObj.data[key].id;
        emailObj.type = "email";
        res.push(emailObj);
    }
    if(parsedObj.data[key].phone !== null){
        phoneObj.matchedRes = parsedObj.data[key].phone;
        phoneObj.id = parsedObj.data[key].id;
        phoneObj.type="phone";
        res.push(phoneObj);
    }  
}
console.log(res);

所需的输出:

[ { matchedRes: 'jack1@yahoo.com', id: 'jack1', type: 'email' },
  { matchedRes: 'jack.clinton@yahoo.com', id: 'jack2', type: 'email' },
  { matchedRes: '+16464922600', id: 'jack2', type: 'phone' } ]

在上面的代码中,使用相同ID的电话和电子邮件创建了单独的对象。

4 个答案:

答案 0 :(得分:3)

这是一个解决方案!

我只是做了一个通用的reducer,然后在/** * @var string */ private $password; <field name="password" type="string" column="password" length="64"/> 上使用它。

然后,我将两个调用的结果都散布到结果数组中:)

phone

希望这会有所帮助,如果您有任何问题,请不要犹豫发表评论;)

答案 1 :(得分:2)

您可以将reduce destructuring assignment 一起使用。并检查是否有电子邮件或电话,然后相应地添加对象

if statement

如果您想查看更多的用例,可以使用destructuring assignment and it's uses,请查看该用例

答案 2 :(得分:2)

这可以通过reduce来实现:

var res =  {"matchObject":"{\"data\":[{\"id\":\"jack1\",\"firstname\":\"jack\",\"lastname\":\"hudson\",\"dob\":\"1990-01-01T00:00:00.000Z\",\"email\":\"jack1@yahoo.com\",\"phone\":null,\"orgid\":\"001\"},{\"id\":\"jack2\",\"firstname\":\"Jack\",\"lastname\":\"Clinton\",\"dob\":\"1991-01-01T00:00:00.000Z\",\"email\":\"jack.clinton@yahoo.com\",\"phone\":\"+16464922600\",\"orgid\":\"002\"}]}"};
var parsedObj = JSON.parse(res.matchObject);
const keyFields = ["email", "phone"];

let result = parsedObj.data.reduce((acc, val) => {
    keyFields.forEach(k => {
       if (val[k]) acc.push({ matchedRes: val.email, id: val.id,  type: k});
    });
    return acc;
}, []);

console.log("Result: ", result);

答案 3 :(得分:2)

如果您正在寻找更短的代码,但仍然对任何人都易于阅读:

var res =  {"matchObject":"{\"data\":[{\"id\":\"jack1\",\"firstname\":\"jack\",\"lastname\":\"hudson\",\"dob\":\"1990-01-01T00:00:00.000Z\",\"email\":\"jack1@yahoo.com\",\"phone\":null,\"orgid\":\"001\"},{\"id\":\"jack2\",\"firstname\":\"Jack\",\"lastname\":\"Clinton\",\"dob\":\"1991-01-01T00:00:00.000Z\",\"email\":\"jack.clinton@yahoo.com\",\"phone\":\"+16464922600\",\"orgid\":\"002\"}]}"};
var parsedObj = JSON.parse(res.matchObject);

var res = [];

Object.entries(parsedObj.data).forEach(el => {
    el = el[1]
    if(el.email !== null)
      res.push({
        matchedRes: el.email,
        id: el.id,
        type: "email"
      })
    if(el.phone !== null)
       res.push({
        matchedRes: el.phone,
        id: el.id,
        type: "phone"
    })
})

console.log(res);