我发现Array.prototype.join
的功能非常有用,因为它仅将联接值应用于数组元素的“内部”连接。像这样:
['Hey', 'there'].join('-') // Hey-there
在此示例中,Array.protoype.map
在其中产生“剩余”破折号:
['Hey', 'there'].map(value => value + '-') // Hey-there-
我一直在寻找一种简洁的方法来映射数组而不转换 将它们转换为字符串,可能转换为新数组,如下所示:
// Intended behaviour
['Hey', 'there'].mapJoin('-') // ['Hey', '-', 'there']
我并不是在寻找一种当务之急的解决方案,因为我可以自己写下来并将其放置在某个地方的全球范围内。 我正在寻找一种本机的方式(ES6很好)来表达它 所以我可以在我所有的项目中写它。
答案 0 :(得分:3)
您可以使用所需的分隔符进行连接,并用加号(或其他值,如果用于连接)进行分割。
var array = ['Hey', 'there'],
separator = '-',
result = array.join(',' + separator + ',').split(',');
console.log(result);
另一种解决方案是采用新索引并用分隔符填充previos索引。
var array = ['Hey', 'there'],
separator = '-',
result = Object.assign(
[],
...array.map((v, i) => ({ [i * 2 - 1]: separator, [i * 2]: v }))
);
console.log(result);
答案 1 :(得分:2)
您正在寻找Ramda's intersperse。
R.intersperse('n', ['ba', 'a', 'a']); //=> ['ba', 'n', 'a', 'n', 'a']
尽管它必须为implemented。
答案 2 :(得分:1)
它并不漂亮或优雅,但是
['Hey', 'there'].reduce(
(acc, value, i, arr) => (acc.push(value), i < arr.length - 1 ? acc.push('-') : 0, acc),
[],
)
答案 3 :(得分:0)
答案 4 :(得分:0)
您可以尝试这个
const mapJoin = (arr, joiner) => {
return arr.reduce( (curr, t) => curr.concat(t, joiner), []).slice(0, arr.length*2-1)
}
const data = ["Hey", "There"]
console.log(mapJoin(data, "-"))
答案 5 :(得分:0)
简单的递归编码
const intersperse = (sep, [ x, ...rest ]) =>
// base case; return empty result
x === undefined
? []
// one remaining x, return singleton
: rest.length === 0
? [ x ]
// default case; return pair of x and sep and recur
: [ x, sep ] .concat (intersperse (sep, rest))
console.log
( intersperse ("~", []) // []
, intersperse ("~", [ 1 ]) // [ 1 ]
, intersperse ("~", [ 1, 2 ]) // [ 1, ~, 2 ]
, intersperse ("~", [ 1, 2, 3 ]) // [ 1, ~, 2, ~, 3 ]
, intersperse ("~", [ 1, 2, 3, 4 ]) // [ 1, ~, 2, ~, 3, ~, 4 ]
)
答案 6 :(得分:0)
您正在寻找易于定义的intersperse
函数:
const intersperse = (x, ys) => [].concat(...ys.map(y => [x, y])).slice(1);
console.log(intersperse("-", ["Hey", "there"])); // ["Hey", "-", "there"]
console.log(intersperse(0, [1, 2, 3])); // [1, 0, 2, 0, 3]
console.log(intersperse(0, [])); // []
或者,您可以将其分解为较小的函数:
const concat = xss => [].concat(...xss);
const concatMap = (f, xs) => concat(xs.map(f));
const intersperse = (x, ys) => concatMap(y => [x, y], ys).slice(1);
console.log(intersperse("-", ["Hey", "there"])); // ["Hey", "-", "there"]
console.log(intersperse(0, [1, 2, 3])); // [1, 0, 2, 0, 3]
console.log(intersperse(0, [])); // []
您甚至可以将它们安装在Array.prototype
上:
Object.assign(Array.prototype, {
concatenate() {
return [].concat(...this);
},
concatMap(f) {
return this.map(f).concatenate();
},
intersperse(x) {
return this.concatMap(y => [x, y]).slice(1);
}
});
console.log(["Hey", "there"].intersperse("-")); // ["Hey", "-", "there"]
console.log([1, 2, 3].intersperse(0)); // [1, 0, 2, 0, 3]
console.log([].intersperse(0)); // []
在Haskell中,您可以这样编写:
intersperse :: a -> [a] -> [a]
intersperse x = drop 1 . concatMap (\y -> [x, y])
可以看到相似之处吗?