这是一个简单的解决方案,适用于IE6(以及可能更早版本),而且没有使用
filter
。
简短概述 → 查看代码中倒数第三个块
toString()
有一个习惯,就是将数组转换为CSV并忽略所有不是字符串的内容,那么为什么不利用它呢?
["foo", null, "bar", undefined, "baz"].toString()
→ foo,,bar,,baz
这是一个非常方便的解决方案,适用于简单的CSV数据导出用例,因为列计数保持不变。
join()
有相同的习惯,但让你选择连接分隔符:
['We built', null, 'this city', undefined, 'on you-know-what'].join(' ')
→ 我们在你懂的东西上建造了这座城市
由于OP要求在逗号后面有一个漂亮的空格,而且可能不喜欢额外的逗号,因此最后需要进行replace
-RegEx处理:
["foo", null, "bar", undefined, "baz"].join(', ').replace(/(, ){2,}/g, ', ')
→ foo,bar,baz
注意: (, ){2,}
是一个相当简单的正则表达式,匹配所有出现了两次或更多次逗号后跟一个空格的情况 - 它因此具有潜在的不良副作用,即过滤掉数据开头或结尾处的任何, ,
或,
。
如果这不是问题,那么你可以使用一个整洁而简单、向后兼容的一行代码就完成了。
如果这是个问题,我们需要想出一个分隔符,它非常特殊,以至于它在你的数据项中出现两次(或一次在开头或结尾)的概率接近于零。比如,你觉得crazy-ſđ½ł⅞⅝⅜¤Ħ&Ł-delimiter
怎么样?
你也可以使用任何字符,甚至是你本地字符集中不存在的字符,因为它只是我们算法的停止标志,所以你可以这样做:
["foo", null, "bar", undefined, "baz"]
.join('emoji-✊-delimiter')
.replace(/(emoji-✊-delimiter){2,}/g, ', ')
或者(在更DRY的版本中:
var delimiter = 'emoji-✊-delimiter'
var regEx = new RegExp('(' + delimiter + '){2,}', 'g')
["foo", null, "bar", undefined, "baz"].join(delimiter).replace(regex, ', ')