将JavaScript数组转换为字符串。

183

我正在尝试遍历一个“value”列表,并将其转换为字符串。以下是代码:

var blkstr = $.each(value, function(idx2,val2) {                    
     var str = idx2 + ":" + val2;
     alert(str);
     return str;
}).get().join(", ");    

alert()函数运行正常并显示正确的值,但是不知何故,jQuery的.get()函数获取的对象类型不正确,导致失败。我做错了什么?


6
“value”是什么?它是一个数组吗?如果是,那么“var str = value.join(', ')”可能会很好地工作。 - StefanS
是的。如果我注释掉 .get() 部分,那么我会得到警告框,显示“id1:val1”,“id2:val2”等。 - Neo
你的意思是“...获取正确的对象类型”吗?(在点击“提问”之前进行快速校对通常是个好主意。)(我删除了早期的评论,因为这个问题比许多其他问题少得多的错别字和错误。) - T.J. Crowder
13个回答

162

如果value不是一个纯数组,这段代码将正常工作:

var value = { "aaa": "111", "bbb": "222", "ccc": "333" };
var blkstr = [];
$.each(value, function(idx2,val2) {                    
  var str = idx2 + ":" + val2;
  blkstr.push(str);
});
console.log(blkstr.join(", "));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>

(输出将会出现在开发者控制台中)

正如Felix所提到的,each()仅仅只是在遍历数组,没有其他作用。


“Associative array”是一个非JavaScript术语,用于表示对象。 - Heretic Monkey
JavaScript对象不是JavaScript数组。你应该告诉人们这不是正确的答案,因为问题被错误地提出了,用户的意思是关联数组,但对我来说,这不是我要搜索的内容。 - Cale McCollough
@CaleMcCollough 问题的提问者在提问时不知道这个叫什么,我也不知道。正如其他评论所说,“关联数组”也是不正确的,因为它指的是抽象数据结构。在JavaScript中,每个对象都是一个关联数组,包括普通数组。所以为了让它更简单,我只使用了“不是普通数组”,我坚持这个定义。答案是正确的,它迭代键,并将数据收集到普通数组中,然后将其转换为字符串。 - Shadow The Spring Wizard

153

从数组转化为字符串非常容易!

var A = ['Sunday','Monday','Tuesday','Wednesday','Thursday']
array = A + ""

现在A是一个字符串了。:)


16
我建议使用 A.toString(),这样更清楚你正在做什么。 - Justin
18
如果你执行[1,2,[3]].toString(),你将得到1,2,3,这结果令人困惑。这个答案只是对同一个有问题的原生字符串方法调用的更糟糕的写法。42个点赞? - Carl Smith
18
你也可以像这样连接一个数组:['Sunday','Monday','Tuesday','Wednesday','Thursday'].join(''); - etoxin
3
Array.join()绝对是最好的选择,因为它不仅仅会使用逗号将值连接在一起,还允许用户确定如何进行连接。例如,您可以使用逗号加空格。 - Felipe Leão
1
这对我来说非常完美。我传递了一个数组,它被更改为用逗号分隔的字符串(没有空格)以进行 API 调用。再次感谢。 - Nick D

138
您可以使用 .toString() 将数组用逗号连接起来。
var array = ['a', 'b', 'c'];
array.toString(); // result: a,b,c

或者,使用 array.join('; '); // 结果: a; b; c 设置分隔符。


4
我只是希望将数组直接转换为字符串,然后用正则表达式去掉多余的部分,但现在这样做更好了! 谢谢Justin。 - cranberry
1
但这并不是问题的情况,它不是关于普通数组的。对于不是普通数组的对象,.toString()会返回"object"或类似的内容。 - Shadow The Spring Wizard

106

不确定这是否是您想要的,但是

var arr = ["A", "B", "C"];
var arrString = arr.join(", ");

这将导致以下输出:

A,B,C


54

将数组转换为字符串的四种方法。

强制转换为字符串

var arr = ['a', 'b', 'c'] + [];  // "a,b,c"

var arr = ['a', 'b', 'c'] + '';  // "a,b,c"

调用.toString()

var arr = ['a', 'b', 'c'].toString();  // "a,b,c"

使用.join()方法进行显式连接

var arr = ['a', 'b', 'c'].join();  // "a,b,c" (Defaults to ',' seperator)

var arr = ['a', 'b', 'c'].join(',');  // "a,b,c"

您可以使用其他分隔符,例如', '

var arr = ['a', 'b', 'c'].join(', ');  // "a, b, c"

使用JSON.stringify()

这样更整洁,因为它对数组内的字符串加引号并正确处理嵌套数组。

var arr = JSON.stringify(['a', 'b', 'c']);  // '["a","b","c"]'

1
JSON.stringify 还可以将单个值转换成一个合适的数组,而不是一个字符串:[8] vs 8。如果我拥有所有的投票,这将是最佳答案。感谢您提到它。 - Noumenon

17

jQuery.each只是循环遍历数组,不会对返回值进行任何操作。你需要使用jQuery.map(我认为get()是不必要的,因为你没有处理jQuery对象):

var blkstr = $.map(value, function(val,index) {                    
     var str = index + ":" + val;
     return str;
}).join(", ");  

演示


但在这种情况下,为什么要使用jQuery呢?map每个元素只引入了一个不必要的函数调用。

var values = [];

for(var i = 0, l = value.length; i < l; i++) {
    values.push(i + ':' + value[i]);
}

// or if you actually have an object:

for(var id in value) {
    if(value.hasOwnProperty(id)) {
        values.push(id + ':' + value[id]);
    }
}

var blkstr = values.join(', ');
∆:它只使用返回值来确定是否应继续循环处理元素。返回“falsy”值将停止循环。

我在这里粘贴了“清理”过的代码。实际上,我正在处理jQuery对象。谢谢,map函数完美地工作。 - Neo
@Neo:只有当value是一个jQuery对象时,你才需要使用map。然后你应该使用value.map(...).get()。但是如果你只有一个jQuery对象的数组,那么就不需要使用get。不客气 :) - Felix Kling

3
这是我的函数,将对象或数组转换为JSON。
function obj2json(_data){
    str = '{ ';
    first = true;
    $.each(_data, function(i, v) { 
        if(first != true)
            str += ",";
        else first = false;
        if ($.type(v)== 'object' )
            str += "'" + i + "':" + obj2arr(v) ;
        else if ($.type(v)== 'array')
            str += "'" + i + "':" + obj2arr(v) ;
        else{
            str +=  "'" + i + "':'" + v + "'";
        }
    });
    return str+= '}';
}

我刚刚编辑到了v0.2 ^.^

 function obj2json(_data){
    str = (($.type(_data)== 'array')?'[ ': '{ ');
    first = true;
    $.each(_data, function(i, v) { 
        if(first != true)
            str += ",";
        else first = false;
        if ($.type(v)== 'object' )
            str += '"' + i + '":' + obj2json(v) ;
        else if ($.type(v)== 'array')
            str += '"' + i + '":' + obj2json(v) ;
        else{
            if($.type(_data)== 'array')
                str += '"' + v + '"';
            else
                str +=  '"' + i + '":"' + v + '"';
        }
    });
    return str+= (($.type(_data)== 'array')? ' ] ':' } ');;
}

2
var arr = new Array();

var blkstr = $.each([1, 2, 3], function(idx2,val2) {                    
    arr.push(idx2 + ":" + val2);
    return arr;
}).join(', ');

console.log(blkstr);

或者

var arr = new Array();

$.each([1, 2, 3], function(idx2,val2) {                    
    arr.push(idx2 + ":" + val2);

});

console.log(arr.join(', '));

2

如果你想使用纯JavaScript

  const strArr = ['h', 'e', 'l', 'l','o'];

  const str = strArr.toString().split(",").join("");

  console.log(str);


1
将数组转换为可附加到URL的GET参数字符串可以按如下方式完成。
function encodeGet(array){
    return getParams = $.map(array , function(val,index) {                    
        var str = index + "=" + escape(val);
        return str;
   }).join("&");
}

将此函数称为:

var getStr = encodeGet({
    search:     $('input[name="search"]').val(),
    location:   $('input[name="location"]').val(),
    dod:        $('input[name="dod"]').val(),
    type:       $('input[name="type"]').val()
});
window.location = '/site/search?'+getStr;

该操作将使用传递给encodeGet函数的数组中的GET参数,将用户重定向到/site/search页面。

1
请注意,jQuery.param(array)所做的与encodeGet(array)所做的相同。 - Curtis Yallop
请注意,现在有一个本地的 URLSearchParams API 用于处理搜索参数。escape 已经被弃用了相当长的时间。 - Heretic Monkey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接