我正在使用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,并且容器不支持外部库
答案 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;
}
}