ssc*_*eck 23 javascript arrays string ecmascript-6
我编写了一个函数,它必须为names值列表支持两种类型的参数.在内部,它将参数作为数组处理.
单个名称以字符串形式给出,倍数名称以字符串数组的形式给出.
// simplified example
let doSome = names => names.map(name => name.toUpperCase())
names(['Bart', 'Lisa'])
// [ 'BART', 'LISA' ]
names('Homer')
// TypeError: names.map is not a function
Run Code Online (Sandbox Code Playgroud)
我找到了一个Array.of()结合使用的解决方案flatten(),需要一些babel配置.
doSome = names => Array.of(names).flatten().map(name => name.toUpperCase());
Run Code Online (Sandbox Code Playgroud)
JavaScript中有没有一种惯用的方法来获取没有类型检查的数组?
Ori*_*ori 28
您可以使用Array.concat(),因为concat接受数组和非数组:
const names = (v) => [].concat(v).map(name => name.toUpperCase())
console.log(names(['Bart', 'Lisa'])) // [ 'BART', 'LISA' ]
console.log(names('Homer')) // ['HOMER']Run Code Online (Sandbox Code Playgroud)
[names].flat()
Run Code Online (Sandbox Code Playgroud)
如果names是一个数组,它将保持原样。其他任何内容都将转换为只有一个元素的数组。
这是可行的,因为.flat()默认情况下仅展平一层。
如果names不是数组,[names]则将其设为只有一个元素的数组,并且.flat()不执行任何其他操作,因为该数组没有子数组。如果names是一个数组,[names]则使其成为具有一个子数组的数组,并将.flat()子数组恢复为父数组。
这是更不言自明的:
names instanceof Array ? names : [names]
Run Code Online (Sandbox Code Playgroud)
这使用一个简单的三元语句,如果它已经是一个数组,则不对其执行任何操作,或者如果它还不是一个数组,则使其成为一个数组。