2

我使用with从GMail API接收数据,然后将其放入jQuery 插件中。问题是(正如页面上的演示具有讽刺意味的那样)当我输入这样的内容时:$.ajax()dataType: "xml"$.xml2json

<animals>
     <dog>
          <name>Rufus</name>
          <breed>labrador</breed>
     </dog>
     <dog>
          <name>Marty</name>
          <breed>whippet</breed>
     </dog>
     <cat name="Matilda"/>
</animals>

我明白了:

{
    animals: {
        dog: [
            {
                name: 'Rufus',
                breed: 'labrador'
            }, {
                name: 'Marty',
                breed: 'whippet'
            }
        ],
        cat: {
            name: 'Matilda'
        }
    }
}

无论如何,如您所见,<animals>其中有两个<dog>s 并且只有一个<cat>;因此,animals["cat"]是一个对象,而animals["dog"]是一个对象数组。<entry>同样,当GMail只返回一个时,feed["entry"]它是一个包含其中内容的数组,但是当有多个标签时,feed["entry"]是一个条目数组,而这些条目又是它们内部内容的数组。

我想要做的是做不同的事情,这取决于我是否有 1 个或多个条目,使用条件语句;为此,我需要一个布尔值,它告诉我有多少条目。我该怎么做呢?欢迎使用 JQuery。

编辑:我想另一个可能的答案是编辑插件本身的源代码并使其提供某种方式来知道它是一个单独的标签(一个类似数组的对象)还是有很多标签(一个“真”数组)。

4

4 回答 4

3

我认为您可以在这里做的最好的事情就是concat将对象/数组简单地转换为一个空数组:

var obj = {a:"hello"};
[].concat(obj); // [{a:"hello"}]

var arr = [{a:"hello"}];
[].concat(arr); // identical results

所以要修复你的对象:

for ( var prop in obj ) {
    obj[prop] = [].concat(obj[prop])
}

这样,您将始终获得一个数组,而不必担心您拥有哪个数组。

于 2012-11-10T14:20:47.660 回答
2
var json = {
    animals: {
        dog: [
            {
                name: 'Rufus',
                breed: 'labrador'
            }, {
                name: 'Marty',
                breed: 'whippet'
            }
        ],
        cat: {
            name: 'Matilda'
        }
    }
};

for ( var i in json ) {
    if ( json.hasOwnProperty( i ) ) {
        if ( json[i] instanceof Array ) {
            // you have an array, do as you please
        } else {
            // you have an object, do as you please
        }
    }
}
于 2012-11-10T14:19:10.077 回答
1

这是 xml2json 中的一个错误,更普遍的是将 XML 转换为 JSON 的问题——没有像 XSLT 或 XSD 这样的描述文档,就无法告诉序列化程序某些东西应该是一个集合。您可能想研究这样方法,以更正式的方式将 XML 转换为 JSON。

同时,这里有一种方法可以强制变量不是数组,如果是则保持不变:

x = [].concat(x);

注意:这是事后编辑的,以使用@Asad 在他的回答中的优越方法

正如您所观察到的,这对于多维数组开始失败,因此听起来您最好开始使用 XSLT 来描述哪些元素始终是集合。

并且不要使用instanceof

instanceof有一个失败的边缘情况。instanceof使用 like的运算符x instanceof Array测试特定构造函数(在本例中window.Array)是否存在于原型链中。但是当变量来自另一个窗口时,这会失败,例如弹出窗口或存在于同一域中的 iframe,并且可以将对象直接传递给其父级。

于 2012-11-10T14:20:32.960 回答
1

您可以使用 jQuerytype()方法来简化您的代码并利用完全跨浏览器兼容的测试

API 参考:http: //api.jquery.com/jQuery.type/

$.each(data, function(i, item) {

    switch($.type(item)) {
      case 'string':
        /* string code*/
        break;

      case 'array':
        /* aray code*/
        break;

        /* ....etc*/
    }
});
于 2012-11-10T16:17:46.607 回答