现在我越来越频繁地使用javascript进行编程,我经常遇到的一项任务就是我想知道可以更优雅地处理。
关于检查变量values
是否是Xs数组,或者更确切地说只是一个X,然后立即对它或其元素进行迭代。
(X是对象,字符串,数字......真的是任何东西 - 除了数组)。
特别是在处理xml或json文件时,单个X未包含在[]中以使其成为1个元素的数组,如果我不注意,我的代码就会中断。
我现在通过以下方式解决这个问题:
if (!(values instanceof Array)) values = [values]
values.forEach(function(value){/*do stuff with value*/});
目前,我已经写了一个功能来处理这个问题,
function arrayIfNot(arr) {return (arr instanceof Array) ? arr : [arr];}
我可以用作
arrayIfNot(values).forEach(function(value){/*do stuff with value*/});
但由于这是一项非常常见的任务,如果没有共同的快捷方式或库函数(jQuery?),我会感到惊讶。
谢谢!
编辑:
我想我可以像这样扩展原型(没有尝试过):
Array.prototype.toArray = function () {return this;};
String.prototype.toArray = function () {return [this];};
...
这样我才能做到
values.toArray().forEach(function(value){/*do stuff with value*/});
但是我总是警告不要扩展原型。你怎么看?
再次感谢!
答案 0 :(得分:4)
就个人而言,我采用了这个成语:
[].concat(a)
这利用了concat
的行为,即如果它的参数是标量,它只是将它添加到数组中;如果它是一个数组,它会添加每个元素。
答案 1 :(得分:2)
在现代浏览器中有一种常见的方法,Array.isArray
,IE9及以上版本支持它。
MDN为不支持的浏览器提供了polyfill。
jQuery拥有自己的版本jQuery.isArray
对于您的具体示例,常用的方法是
values = Array.isArray(values) ? values : [values];
答案 2 :(得分:0)
如果您愿意使用图书馆,Underscore.js会为基本JavaScript添加许多精彩内容。使用Underscore,我通常做这样的事情:
function myFunction(arg) {
arrayArg = _.flatten([arg])
}
如果您的arg
本身可能包含您需要保留的数组,只需将true
作为第二个参数添加到flatten
。