从javascript哈希中获取密钥

时间:2010-05-30 01:42:51

标签: javascript arrays hashmap

我正在使用Twitter注释api的最新草稿。示例位数据似乎是

status {
     annotations : [
         {myAnnotationType:{myKey:myValue}},
         {someoneElsesAnnotationType:{theirKey:theirValue}},
     ]
}

现在我想检查一个状态,看它是否有一个带有myAnnotationType的注释。如果注释是哈希而不是数组,我可以写var ann = status.annotations.myAnnotationType。但事实并非如此,我写了这个:

function getKeys(obj){
    var keys = [];
    for (key in obj) {
        if (obj.hasOwnProperty(key)) { keys[keys.length] = key; }
    } 
    return keys;
}
function getAnnotation(status, type){
     for(var i=0;i<status.annotations.length;i++){
         var keys = getKeys(status.annotations[i]);
         for(var j=0;j<keys.length;j++){
             if(keys[j] == type){
                 return status.annotations[i];
             }
         }
     }
}
var ann = getAnnotation(status, "myAnnotationType");

一定有更好的方法!有吗?

PS我不能使用jquery或任何东西,因为这是在caja小部件中使用的js,并且容器不支持外部库

2 个答案:

答案 0 :(得分:0)

啊,如果你能确定他们永远不会碰撞,那么jQuery会让你轻松:

var annotations = $.extend.apply($, status['annotations'] || []);
var annotation = annotations['myAnnotationType'];

我猜您可以编写自己的预算extend

function collapse(annotations) {
  var result = {};
  for (var i = 0; i < annotations.length; i++) {
    var annotation = annotations[i];
    for (var key in annotation) {
      if (annotation.hasOwnProperty(key)) {
        result[key] = annotation[key]; // Using a deep cloning function possible here
      }
    }
  }
  return result;
}

或者你可以修改jQuery的extend

答案 1 :(得分:0)

如果我正确理解了此函数的用途,那么您将尝试返回包含键(status.annotations)的数组(type)中的第一个对象

function getAnnotation(status, type){
  for (var i=0; i<status.annotations.length ; i++) {
    var obj = status.annotations[i];
    if (obj.hasOwnProperty(type)) return obj;
  }
}