我有一个具有粗略跟随结构的对象。我需要查找另一个对象(月份)中是否存在一封电子邮件,如果存在,则需要查找哪一封电子邮件。理想情况下,我可以查看用户所属的所有月份,因此我可以说“hello@gmail.com在9月和10月活跃”。我对Underscore有点熟悉所以我可以使用它。
如何使用电子邮件地址作为唯一键创建一个新对象,其中包含发送电子邮件的所有日期数组?
data: Object {
2015-08-09: Object {
hello@gmail.com: 5,
hello2@gmail.com: 4,
hello4@gmail.com: 6
}
2015-09-09: Object {
hello@gmail.com: 5,
hello2@gmail.com: 4,
hello4@gmail.com: 6,
hello9@gmail.com: 4
}
2015-10-09: Object {
hello@gmail.com: 5,
hello2@gmail.com: 4,
hello4@gmail.com: 6,
hello9@gmail.com: 10,
hello5@gmail.com: 7
}
}
答案 0 :(得分:1)
您可以使用for ... in
循环遍历对象,并从原始对象构建新对象。
function flipObj( i ) {
// If the input variable is not an object, fail.
if( typeof i !== "object" ) return false;
// If the input object is empty, fail
if( Object.keys( i ).length === 0 ) return false;
// Create an empty object.
o = {};
// Loop through the dates
for( var d in i ) {
// If the property in question is not an object, skip it.
if( typeof i[d] !== "object" ) continue;
// If the property is empty, skip it.
if( Object.keys( i[d] ).length === 0 ) continue;
// Loop through the email addresses
for( var e in i[d] ) {
// If there is no property in our created object for the email, make one
if(!o[e]) o[e] = { days: [], id: i[d][e] };
// Push the day into the days array for the email object in question.
o[e].days.push( d );
}
}
// If our new object is empty, fail
if( Object.keys( o ).length === 0 ) return false;
// Return our new object.
return o;
}
// Works
console.log( flipObj( { '2015-08-09': { 'hello@gmail.com': 5, 'hello2@gmail.com': 4, 'hello4@gmail.com': 6 }, '2015-09-09': { 'hello@gmail.com': 5, 'hello2@gmail.com': 4, 'hello4@gmail.com': 6, 'hello9@gmail.com': 4 }, '2015-10-09': { 'hello@gmail.com': 5, 'hello2@gmail.com': 4, 'hello4@gmail.com': 6, 'hello9@gmail.com': 10, 'hello5@gmail.com': 7 } } ) );
// Fails
console.log( flipObj( {} ) );
// Fails
console.log( flipObj( { 'hello': 'world' } ) );
以下是上述脚本的输出
[object Object] {
hello2@gmail.com: [object Object] {
days: ["2015-08-09", "2015-09-09", "2015-10-09"],
id: 4
},
hello4@gmail.com: [object Object] {
days: ["2015-08-09", "2015-09-09", "2015-10-09"],
id: 6
},
hello5@gmail.com: [object Object] {
days: ["2015-10-09"],
id: 7
},
hello9@gmail.com: [object Object] {
days: ["2015-09-09", "2015-10-09"],
id: 4
},
hello@gmail.com: [object Object] {
days: ["2015-08-09", "2015-09-09", "2015-10-09"],
id: 5
}
}
false
false
正如您所看到的,我们现在每个电子邮件地址都有一个对象,其中包含日期和ID的数组。