在多个对象中查找相同的键

时间:2015-08-25 19:27:55

标签: javascript jquery object

我有一个具有粗略跟随结构的对象。我需要查找另一个对象(月份)中是否存在一封电子邮件,如果存在,则需要查找哪一封电子邮件。理想情况下,我可以查看用户所属的所有月份,因此我可以说“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
  }
}

1 个答案:

答案 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的数组。