将字符串转换为数组

问题描述 投票:0回答:13

如何在 Javascript 中将字符串转换为数组,就像 PHP(数组)一样。

//PHP
$array = (array)"string"

基本上我有一个变量,可以是数组或字符串,如果是字符串,我想使用内联命令将其设为数组。

javascript
13个回答
42
投票

哈基,但有效:

[].concat(arrayOrString);

//Usage:
[].concat("a");
//["a"]
[].concat(["a"]);
//["a"]

29
投票

JavaScript 是一种原型语言,没有类型转换系统。

一种解决方案是检查变量是否是字符串并将其转换为数组。例如:

if (typeof someVariable === 'string') someVariable = [someVariable];

在 PHP 中,如果您对 string 进行检查,例如(例如:

$array = 'string';
):

$array = (array) $array;  // ex: "string" becomes array("string")

JavaScript 的等价物是

arr = typeof arr === 'string' ? [arr] : arr;

如果您的变量

arr
不一定是字符串,您可以使用
instanceof
编辑:或
Array.isArray
):

arr = arr instanceof Array ? arr : [arr];
arr = Array.isArray(arr) ? arr : [arr];

7
投票
var str    = "string";
var array  = str.split('');

console.log(array); // ['s', 't', 'r', 'i','n','g']

4
投票

您可以在 jQuery 中...

var arr = "[1,2,3,4,5]"; 
window.x = $.parseJSON(arr);
console.log(x);//cast as an array...

即使你有类似的东西它也有效

[{"key":"value"}]

但是,如果你有这样的东西,这可能不起作用......

[{key:"value"}] // different is the " (double quotes) on key

3
投票

将字符串转为数组:

var myString = "['boop','top','foo']";
var myArray = JSON.parse(myString)

1
投票

就这样做吧

"sample".split("");

你会得到

["s", "a", "m", ...]

0
投票

在 JS 中你无法转换为数组,但一个简单的三元运算就可以做到你想要的。

var str = 'string';
var arr = (str instanceof Array) ? str : [ str ];

这适用于任何非数组对象或任何原始值。如果您确定此处只能遇到实际的

Array
对象和
string
基元,则以下内容会更快一些:

var arr = (typeof str === 'string') ? [ str ] : str;

0
投票
"1,2,3".split(",") 
=> ["1", "2", "3"]

使用 split()


0
投票

Val 的建议也适用于具有数组数组的字符串

var str = "[[1121,1],[1122,2],[1123,3]]";
var arr = $.parseJSON(str);
console.log(arr); //returns array of arrays

0
投票

您还可以使用以下 if 语句:

if(array instanceof Array != true) {array = [array];}

0
投票
Array.isArray(foo) || (foo = [foo]);

或者如果这不舒服

foo = Array.isArray(foo) ? foo : [foo];

0
投票

现代 JavaScript 现在有 Array.prototype.flat() 可以解决这个问题。

let a = "a";
let b = "b";

[a].flat(); // result: ["a"]
[[a, b]].flat(); // result ["a", "b"]

这允许您在函数中执行此操作:

function acceptsArrayOrScalar(arrayOrScalar){
   return [arrayOrScalar].flat();
}

acceptsArrayOrScalar(a); // returns [a]
acceptsArrayOrScalar([a, b]); // returns [a, b]

如果您希望能够使用 for..of 或 forEach 迭代参数并且不想手动检查 isArray() 等,那么这种事情很有用。

function doStuff(param){
   [param].flat().forEach(x => console.log(x));
}

在上面的示例中,如果您关心的是能够处理可变数量的参数,那么您可能可以使用 ...rest 参数获得类似的结果:

function doMoreStuff(...param){
   param.forEach(x => console.log(x));
}

请注意,尽管在最后一个示例中,我们不接受标量或数组,但我们接受可变数量的参数,因此它的签名略有不同,但它可能正是您所需要的。

doMoreStuff(a); // logs "a"
doMoreStuff(a, b); // logs "a" and then logs "b"
doMoreStuff([a, b]); // not what we want: logs ["a", "b"]

可以说,Array.isArray() 三元计算速度更快,任何使用此技巧的生产代码不太可能会受到重大影响,但如果在游戏循环或需要高性能的东西中,请注意这种细微差别。


-2
投票

已经有针对 Array.flatten()

提案
,并且可以与
babel-preset-stage-2
一起使用。

const array = ['foo'].flatten()
console.log(array) // ['foo']

const array = [['foo', 'bar']].flatten()
console.log(array) // ['foo', 'bar']

© www.soinside.com 2019 - 2024. All rights reserved.