Javascript 重构对象数组

Javascript 重构对象数组,javascript,ecmascript-6,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,\"o

下面的代码将输入为对象数组,我想转换成不同的格式

下面的代码可以很好地工作,但我需要一个更为重构的较短格式,以实现我的目标

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创建了不同的对象。

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

var res={“matchObject”:“{”数据“:[{”id“:“jack1\”,“firstname\”:“jack\”,“lastname\”:“hudson\”,“dob\”:“1990-01-01T00:00:00.000Z\,“email\:”jack1@yahoo.com\“,”电话\“:空,\”orgid\“:\”001\”,“{\”id\“:”jack2\“,”firstname\“:”Jack\“,”lastname\“:”Clinton\“,”dob\“:”1991-01-01T00:00:00.000Z\“,”email\“:”Jack“。clinton@yahoo.com\“,”电话\“:\”+16464922600\“,”组织\“:\”002\“}]}”;
var parsedObj=JSON.parse(res.matchObject);
let op=parsedObj.data.reduce((out,{id,email,phone})=>{
如果(电子邮件){
push({matchedRes:email,id,type:`email`})
} 
如果(电话){
push({matchesRes:phone,id,type:`phone`})
}
返回
},[])
console.log(op)
这里有一个解决方案

我刚刚做了一个通用的减速机,然后我在
手机
电子邮件
上使用它

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

var res={“matchObject”:“{”数据“:[{”id“:“jack1\”,“firstname\”:“jack\”,“lastname\”:“hudson\”,“dob\”:“1990-01-01T00:00:00.000Z\,“email\:”jack1@yahoo.com\“,”电话\“:空,\”orgid\“:\”001\”,“{\”id\“:”jack2\“,”firstname\“:”Jack\“,”lastname\“:”Clinton\“,”dob\“:”1991-01-01T00:00:00.000Z\“,”email\“:”Jack“。clinton@yahoo.com\"“,”电话\“:\”+16464922600\”,”组织\“:\”002\“}]}”;
var parsedObj=JSON.parse(res.matchObject);
常量提取数据=(对象,类型)=>obj.reduce((acc,elt)=>(
elt[type]&&acc.push({matchedRes:elt[type],id:elt.id,type:type})
,行政协调会),[]);
const result=[…extractData(parsedObj.data,'email'),…extractData(parsedObj.data,'phone');

console.log(result);
这应该可以通过reduce实现:

var res={“matchObject”:“{”数据“:[{”id“:“jack1\”,“firstname\”:“jack\”,“lastname\”:“hudson\”,“dob\”:“1990-01-01T00:00:00.000Z\,“email\:”jack1@yahoo.com\“,”电话\“:空,\”orgid\“:\”001\”,“{\”id\“:”jack2\“,”firstname\“:”Jack\“,”lastname\“:”Clinton\“,”dob\“:”1991-01-01T00:00:00.000Z\“,”email\“:”Jack“。clinton@yahoo.com\"“,”电话\“:\”+16464922600\”,”组织\“:\”002\“}]}”;
var parsedObj=JSON.parse(res.matchObject);
const keyFields=[“电子邮件”、“电话”];
让结果=parsedObj.data.reduce((acc,val)=>{
keyFields.forEach(k=>{
if(val[k])acc.push({matchedRes:val.email,id:val.id,type:k});
});
返回acc;
}, []);

console.log(“Result:,Result);
如果您正在寻找较短的代码,但对任何人来说都很容易阅读:

var res={“matchObject”:“{”数据“:[{”id“:“jack1\”,“firstname\”:“jack\”,“lastname\”:“hudson\”,“dob\”:“1990-01-01T00:00:00.000Z\,“email\:”jack1@yahoo.com\“,”电话\“:空,\”orgid\“:\”001\”,“{\”id\“:”jack2\“,”firstname\“:”Jack\“,”lastname\“:”Clinton\“,”dob\“:”1991-01-01T00:00:00.000Z\“,”email\“:”Jack“。clinton@yahoo.com\"“,”电话\“:\”+16464922600\”,”组织\“:\”002\“}]}”;
var parsedObj=JSON.parse(res.matchObject);
var-res=[];
Object.entries(parsedObj.data).forEach(el=>{
el=el[1]
如果(el.email!==null)
再推({
matchedRes:el.email,
id:el.id,
键入:“电子邮件”
})
如果(el.phone!==null)
再推({
matchedRes:el.phone,
id:el.id,
类型:“电话”
})
})

console.log(res)
最好不要滥用条件运算符来代替
if
。条件运算符是在您需要结果表达式时使用的-如果您不需要表达式,则条件运算符不合适。我同意您的看法,它通常可读性较差,并且仅在某些情况下才合适。但OP要求使用较短的格式。..:)我把我最好的东西给了最短的版本!你可以分解作业使它更简短谢谢你的热烈响应。今天就用Reduce学习了很多重构技术。@user804401你应该用谷歌搜索类似于
javascript性能映射vs Reduce
,但据我所知,这将是非常重要的e、 性能主要取决于您的映射/缩减函数,但最终,这两个函数的作用是相同的:在数组上迭代,执行映射/缩减函数,然后将此函数的结果添加到目标对象中。或许缩减会稍微重一些(甚至不确定这一点),但我认为,当您遇到这种微调问题时,您可能更希望修改您的数据模型,而不是使用
reduce
!对我来说似乎非常优化:)您可以对赋值进行分解以使其更简短我看到了您的答案。很好的解决方案!唯一的小问题是OP想要的电话、电子邮件字段映射到matchedRes字段,对吗?是的,修复了关键命名伙伴。感谢您指出此处的误读