【问题标题】:How to join an associative array into a string如何将关联数组加入字符串
【发布时间】:2012-05-26 10:17:20
【问题描述】:

我现在正在尝试这样做,我想知道是否有一种“最常用”的方法可以将关联数组(它的值)加入到由字符分隔的字符串中。

例如,我有

var AssocArray = { id:0, status:false, text:'apple' };

连接这个对象的元素得到的字符串将是

"0, false, 'apple'" or "0, 0, 'apple'"

如果我们用“,”字符连接它们 任何想法?谢谢!

【问题讨论】:

  • 没有内置方法可以做到这一点;只需编写一小段代码。请注意,for ... in 循环返回的属性的顺序是不可预测的,因此如果您想强制采用一些规范的方式对值进行排序,您必须自己考虑一些事情。

标签: javascript string join associative-array


【解决方案1】:

只需循环遍历数组。 JavaScript 中的任何数组都有索引,甚至是关联数组:

    var AssocArray = { id:0, status:false, text:'apple' };
    var s = "";
    for (var i in AssocArray) {
       s += AssocArray[i] + ", ";
    }
    document.write(s.substring(0, s.length-2));

将输出:0, false, apple

【讨论】:

  • 'i in AssocArray' 应该是 'var i in AssocArray',以免污染全局命名空间。
  • 非常正确,在这个例子中我没有考虑到这种事情。
  • 也许您应该像这样使用“hasOwnProperty”添加检查:for (var i in AssocArray) { **if (AssocArray hasOwnProperty(i))** s += AssocArray[i] + ", "; } 请参阅:stackoverflow.com/questions/921789/…
【解决方案2】:

Object.map、Object.forEach等函数的实现仍在讨论中。现在,你可以坚持这样的:

function objectJoin(obj, sep) {
    var arr = [], p, i = 0;
    for (p in obj)
        arr[i++] = obj[p];
    return arr.join(sep);
}

编辑:使用临时数组并加入它而不是字符串连接以提高性能。

编辑 2:在大多数最新浏览器中,arr.push(obj[p]); 似乎实际上可以更快,而不是增加计数器。见 cmets。

【讨论】:

  • 您不只是使用arr.push(obj[p]) 而不是arr[i++] = obj[p] 有什么原因吗?
  • 那是因为即使push 是一个非常快的函数,它仍然是一个函数,并且调用一个函数是耗时的。如今,许多浏览器都对其进行了特殊优化,但并非总是如此。另一种技术是在使用 new Array(lentgh) 为其元素分配之前对数组进行尺寸标注,以避免对其进行重新尺寸标注,但只有在已知 length 时才能这样做,而事实并非如此。
  • 听起来像是过早的优化。看起来这两种方法之间的性能差异很大,“最佳”方法取决于所使用的浏览器。查看这个 jsperf 示例:jsperf.com/array-increment-vs-array-push
  • 不错,我确信已经进行了一些优化步骤。我真的很惊讶他们走得那么远。一年前的结果完全不同。
  • 根据具体的构造方式,它似乎有很大的不同。不过,最慢的方法仍然是每秒数百万次操作,因此对于大多数代码而言,这不太可能成为真正的性能问题。此外,根据代码的确切表达方式会改变哪个浏览器最快; Chrome、IE 和 Firefox 在各种版本中均名列前茅。确保使用循环的结果似乎使它“更好”,但这始终是 JS 微基准测试的问题,因为可以确定代码路径最终什么都不做。
【解决方案3】:
Object.keys(AssocArray).map(function(x){return AssocArray[x];}).join(',');

PS:某处有Object.values 方法,但这不是标准。还有像hashish这样的外部库。

【讨论】:

  • 我真的很喜欢单行,但你必须记住两点:它不适用于 IEmap 可能会很慢。跨度>
  • 1) 它确实适用于具有兼容性库的 IE
  • ali 从来没有告诉过任何关于使用其他库的事情,但无论如何,调用函数比字符串连接要慢得多,即使你不想连接字符串,你也可以使用临时数组并使用 @987654325最后@@。
猜你喜欢
  • 2016-01-18
  • 2012-07-18
  • 2013-06-07
  • 1970-01-01
  • 2011-06-05
  • 1970-01-01
  • 2019-06-26
  • 1970-01-01
  • 2017-01-13
相关资源
最近更新 更多