получить ключ из хэша JavaScript - PullRequest
0 голосов
/ 30 мая 2010

Я работаю с последним проектом 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 или что-то еще, поскольку это js для использования в виджете caja, а контейнер не поддерживает внешние библиотеки

Ответы [ 2 ]

0 голосов
/ 30 мая 2010

Если я правильно понимаю назначение этой функции, вы пытаетесь вернуть первый объект в массиве (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;
  }
}
0 голосов
/ 30 мая 2010

Ах, боже, 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...