2016-03-11 43 views
1

在我的项目中,我经常发现自己正在检查值是否为数组。将单个值转换为数组

如果该值不是一个数组,我从它创建一个单元数组。

如果值为undefinednull,我创建一个空数组。

值本身通常是任一对象的阵列或单个对象或undefined

const array = value ? (Array.isArray(value) ? value: [value]) : []; 

是否有这样做(也许lodashunderscore)的更简洁的方式,在我决定考虑此因素到一个单独的实用功能?

回答

3

你可以做

var eventsArray = events ? [].concat(events) : []; 

.concat()函数接受两个数组和个别参数,所以无论哪种方式,你最终你想要什么。

1

因为您在代码中使用const我假设您使用的是ES2015/ES6。如果没有值或未定义传递,ES1015的 Default function parameters允许使用默认值初始化形式参数。

function abc(value = []) { 

    const array = Array.isArray(value) ? value: [value]; 

} 
+1

如果传递未定义或为空,值参数设置为空数组 – Darshan

+0

酷,我不知道 – krl

+0

@RolandStarke感谢指出 – Darshan

1

下面是使用lodash的castArrayisNil的解决方案都在一个mixin包裹起来:

_.mixin({'asArray' : function(value){ 
    return _.isNil(value) ? [] : _.castArray(value); 
}}); 

用法:

_.asArray(null)  -> [] 
_.asArray(undefined) -> [] 
_.asArray(0)   -> [0] 
_.asArray(false)  -> [false] 
_.asArray([1,2,3]) -> [1,2,3] 
_.asArray('wibble') -> ['wibble'] 
1

如果使用ES6,你能做到以下几点,这是比.concat()更清洁;

function method(value = []) { 
    const array = [...value]; 
}