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.
4 Réponses :
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);
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);
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));
Vous pouvez soit utiliser le tableau . réduire & Array.splice pour parcourir le tableau lettre par lettre (évite de créer plusieurs tableaux temporaires): Ou utilisez une combinaison de Array.join , String.split & Array. reverse (crée plusieurs tableaux temporaires): Certaines lignes pourraient être combinées, pour le rendre plus court et encore assez clair: 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);
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 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);
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?