检查Object.key()是否与变量匹配

时间:2016-04-05 04:29:02

标签: javascript object for-loop

我有一个对象:

messages = {
    V1: {
        summary: "summary one",
        cause: "cause one",
        code: "1"
},
    V2: {
        summary: "summary two",
        cause: "cause two,
        code: "2"
}

我想将event.details的值与对象消息的键进行比较,并为匹配键的摘要,原因和代码设置变量。

到目前为止我的实施:

 if (event.details === Object.keys(messages)) {
    var a = the summary of the matching key;
    var b = the cause of the matching key;
    var c = the code for the matching key;
};

后来我在我的代码中使用了这些变量.... 目前我的结果是:

event.details = "V1"
Object.Keys(messages) = ["V1","V2"]

但这只是给了我一系列的钥匙。我现在想获得匹配密钥的信息。

如何检查密钥是否与event.details相匹配?以及如何将变量设置为密钥的摘要,原因和代码?

2 个答案:

答案 0 :(得分:4)

只需访问它:var message = messages[event.details]。如果message是一个对象(不是undefined),它就存在,您可以访问message.summary等等:

if (message) {
   // message.summary
   // message.cause
   // ...
}

答案 1 :(得分:0)

菲利克斯说,你通常可以这样做:

var message = messages[event.details]

非常安全。但是,对于一般解决方案(其中 event.details 可能返回任何值),您可能要检查 event.details 是否属于自己的属性,而不是继承的属性,或确保消息没有任何继承属性,例如

var messages = Object.create(null);
messages['V1'] = {
    summary: "summary one",
    cause: "cause one",
    code: "1"
};
messages['V2'] = {
    summary: "summary two",
    cause: "cause two",
    code: "2"
};

这有点笨拙,所以它很好地使用了一个简单的 extend 函数,它只是将一个对象的属性复制到另一个对象,所以:

function extend(toObj, fromObj) {
  Object.keys(fromObj).forEach(function(prop) {
    toObj[prop] = fromObj[prop];
  });
  return toObj;
}

然后你可以这样做:

var messages = extend(Object.create(null), {
  V1: {summary: "summary one",
       cause: "cause one",
       code: "1"
  },
  V2: {summary: "summary two",
       cause: "cause two",
       code: "2"
  }
});

现在您可以确定消息没有意外的属性,无论属性名称如何。 extend 函数可以包含一个“深层”标记来执行深层复制,但这是另一个故事(并且已经有很多问题和答案)。