使用javascript在空格后反转数组

问题描述 投票:2回答:4

我有一个我想反转的数组

['我','','l','o','v','e','','E','a','r','t','h'];

我想像这样扭转它

[“I”,“”,“e”,“v”,“o”,“l”,“”,“h”,“t”,“r”,“a”,“E”]

问题是我可以使用array.slice().reverse();来反转它,但它会反转大厅阵列,我想在空间之后反转。谢谢

javascript arrays reverse
4个回答
9
投票

好吧,一些肮脏的解决方案可能类似于这个:

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);

1
投票

你可以把它变成一个字符串,然后拆分和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);

1
投票

您可以使用Array.reduceArray.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.joinString.splitArray.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);

1
投票

您可以采用递归方法并收集子数组并反转此值。

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; }
© www.soinside.com 2019 - 2024. All rights reserved.