我有一个我想反转的数组
['我','','l','o','v','e','','E','a','r','t','h'];
我想像这样扭转它
[“I”,“”,“e”,“v”,“o”,“l”,“”,“h”,“t”,“r”,“a”,“E”]
问题是我可以使用array.slice().reverse();
来反转它,但它会反转大厅阵列,我想在空间之后反转。谢谢
好吧,一些肮脏的解决方案可能类似于这个:
var sentence = ['I', ' ', 'l', 'o', 'v', 'e', ' ', 'E', 'a', 'r', 't', 'h'];
var reversed = sentence.join('').split(' ').map(word => word.split('').reverse().join('')).join(' ').split('');
console.log(reversed);
你可以把它变成一个字符串,然后拆分和flatMap
const arr = ['I', ' ', 'l', 'o', 'v', 'e', ' ', 'E', 'a', 'r', 't', 'h'];
const res = arr
.join('')
.split(' ')
.flatMap(e => (e + ' ').split('').reverse())
.slice(1);
console.log(res);
您可以使用Array.reduce和Array.splice逐个循环遍历数组(避免创建多个临时数组):
var sentence = ['I', ' ', 'l', 'o', 'v', 'e', ' ', 'E', 'a', 'r', 't', 'h'];
var reversed = sentence.reduce((acc, letter) => {
if (letter === ' ') {
acc.result.push(letter);
acc.insertIndex = acc.result.length;
} else {
acc.result.splice(acc.insertIndex, 0, letter);
}
return acc;
}, {result: [], insertIndex: 0});
console.log('reversed:', reversed.result);
或者使用Array.join,String.split和Array.reverse的组合(创建多个临时数组):
var arr = ['I', ' ', 'l', 'o', 'v', 'e', ' ', 'E', 'a', 'r', 't', 'h'];
var sentence = arr.join(''); // "I love Earth"
var words = sentence.split(' '); // [ "I", "love", "Earth" ]
var reverseParts = words.map(w => w.split('').reverse().join('')); // [ "I", "evol", "htraE" ]
var reverseSentence = reverseParts.join(' '); // "I evol htraE"
var reversed = reverseSentence.split(''); // [ "I", " ", "e", "v", "o", "l", " ", "h", "t", "r", "a", "E" ]
console.log(reversed);
可以组合某些线条,使其更短并且仍然非常清晰:
var arr = ['I', ' ', 'l', 'o', 'v', 'e', ' ', 'E', 'a', 'r', 't', 'h'];
var words = arr.join('').split(' '); // [ "I", "love", "Earth" ]
var reverseParts = words.map(w => w.split('').reverse().join('')); // [ "I", "evol", "htraE" ]
var reversed = reverseParts.join(' ').split(''); // [ "I", " ", "e", "v", "o", "l", " ", "h", "t", "r", "a", "E" ]
console.log(reversed);
您可以采用递归方法并收集子数组并反转此值。
function swap(array, i = 0, temp = []) {
if (i >= array.length || array[i] === ' ') {
temp.forEach((v, j) => array[i - j - 1] = v);
temp = [];
} else {
temp.push(array[i]);
}
if (i >= array.length) return array;
return swap(array, i + 1, temp);
}
var array = ['I', ' ', 'l', 'o', 'v', 'e', ' ', 'E', 'a', 'r', 't', 'h'];
console.log(swap(array));
.as-console-wrapper { max-height: 100% !important; top: 0; }
另一种方法是在返回途中改变价值。
function swap(array, i = 0, temp = []) {
if (i >= array.length) return array;
swap(array, i + 1, array[i] === ' ' ? temp = [] : (temp.push(array[i]), temp));
if (temp.length) array[i] = temp.shift();
return array;
}
var array = ['I', ' ', 'l', 'o', 'v', 'e', ' ', 'E', 'a', 'r', 't', 'h'];
console.log(swap(array));
.as-console-wrapper { max-height: 100% !important; top: 0; }