2
votes

Inverser le tableau après l'espace en utilisant javascript

J'ai un tableau que je veux inverser comme

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

Je veux l'inverser comme ça

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

Le problème est que je peux l'inverser en utilisant array.slice (). reverse (); mais cela inverse tout le tableau et je veux inverser après où est l'espace.


1 commentaires

Qu'en est-il de la division d'abord sur le caractère espace, puis de la division de chaque chaîne en caractères et de l'inverser, puis de la jointure du tout?


4 Réponses :


9
votes

Eh bien, une solution sale peut être similaire à celle-ci:

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


0 commentaires

1
votes

Vous pouvez en faire une chaîne, puis diviser et 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);


0 commentaires

1
votes

Vous pouvez adopter une approche récursive et collecter des sous-tableaux et inverser ces valeurs.

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

Une autre approche en changeant la valeur au retour.

.as-console-wrapper { max-height: 100% !important; top: 0; }
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));


0 commentaires

1
votes

Vous pouvez soit utiliser le tableau . réduire & Array.splice pour parcourir le tableau lettre par lettre (évite de créer plusieurs tableaux temporaires):

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

Ou utilisez une combinaison de Array.join , String.split & Array. reverse (crée plusieurs tableaux temporaires):

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

Certaines lignes pourraient être combinées, pour le rendre plus court et encore assez clair:

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


0 commentaires