数组检查后跟forEach()

时间:2014-08-05 21:11:42

标签: javascript arrays casting prototype

现在我越来越频繁地使用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*/});

但是我总是警告不要扩展原型。你怎么看?

再次感谢!

3 个答案:

答案 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