【问题标题】:How to loop through multidimensional associative javascript array?如何循环遍历多维关联javascript数组?
【发布时间】:2012-05-26 20:12:35
【问题描述】:

我有“多维关联”javascript 数组(实际上是具有属性的对象,因为 JS 不能有本机关联数组):

var multiArray={ AAA:"one", BBB:"two", CCC:{ 0:"xxx", 1:"yyy", 2:"zzz"} };

我需要从这个数组中获取这样的字符串:

'AAA=one & BBB=two & CCC=xxx,yyy,zzz'

我该怎么做?

如果我使用两个这样的简单循环:

for(var key in multiArray)
{
        for(var subkey in multiArray[key])
        {
            string = string + multiArray[key][subkey]+",";
        }
}

我得到这样的东西:

'AAA = o,n,e & BBB = t,w,o & CCC = xxx, yyy,zzz'

这不是我需要的。

任何使用 Javascript的解决方案?

【问题讨论】:

  • 为什么multiArray['CCC'] 不是数组?
  • 因为 JS 不能有原生关联数组 有趣。你能详细说明一下吗?
  • @KooiInc Javascript 已索引数组和对象。安德鲁大概就是这个意思。

标签: javascript loops multidimensional-array associative-array


【解决方案1】:

好的,我在这里创建了一个小提琴:http://jsfiddle.net/bJ6HH/。 它适用于任何深度的嵌套。

【讨论】:

  • 是的,这个答案有效。这里的关键是检查属性是否为对象:'if(typeof o[k] == 'object')' ;
  • 那为什么有人反对这个?我知道 inhan 的回答更加复杂和详细,但是对于这个简单的场景,我发现我的方法更简单......
  • 是的,我同意,您的代码实际上更好。我刚刚在我的建议中添加了数组功能。我不会对您的解决方案投反对票。一定是有人弄错了。
  • @Andrew typeof o[k] == 'object' 在某种程度上实现了这一点。但它是一个索引数组,您需要使用o[k] instanceof Array,因为 Array 类扩展了 Object
【解决方案2】:

我会使用类似的函数

var multiArray={ AAA:"one", BBB:"two", CCC:{ 0:"xxx", 1:"yyy", 2:"zzz"} };

function objToStr(o,delim) {
    if (/^(string|boolean|number)$/.test(typeof o)) return o;
    delim = delim || '&'; // delimiter
    var arr = [], isArray = true;
    for (var j in o) {
        if (isNaN(parseInt(j))) { isArray = false; break; }
    }
    if (isArray) {
        for (var j in o) arr[j] = objToStr(o[j],delim);
        return arr.join(',');
    }
    for (var j in o) {
        if (typeof o[j] != 'object') arr.push(j+'='+o[j]);
        else arr.push(j+'='+objToStr(o[j],delim));
    }
    return arr.join(delim);
}
console.log(objToStr(multiArray,'&'))

编辑:如果这将是一个 GET 查询,您需要在此处转义必要的字符。另外,我不确定您对以下数组的结果有何期望,因此我无法编写最适合您需求的代码。

var multiArray={ AAA:"one", BBB:"two", CCC:{ 0:"xxx", 1:"yyy", 2:{a:1, b:2}} };

【讨论】:

  • 虽然Parth的答案有正确的关键点,但他的结果字符串并不完全正确。你的函数返回我真正想要的。谢谢。
  • 不客气。尽管由于我在下面的编辑部分中提到的这两点,它不是最终的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-15
  • 1970-01-01
  • 2016-07-15
  • 2013-07-05
  • 2013-04-01
相关资源
最近更新 更多