-2
votes

Fusionner deux tableaux à un index spécifique

Disons que j'ai une matrice appelée array1: strong> xxx pré>

et j'ai un autre appelé array2: stry> p>

var array2 = [3, 4];


6 commentaires

Définissez «élégant» et s'il vous plaît partagez vos propres tentatives et expliquez comment ces tentatives ont échoué.


@Davidthomas J'ai changé la question à la plus efficace , comment est-ce? J'ai également inclus une tentative possible à cela comme une réponse à ma propre question .


L'efficacité est toujours jolie nébuleuse - comment mesurez-vous? La complexité du temps est potentiellement une métrique moins ambiguë mais non sans ses propres problèmes.


Je comprends ça, mais selon qui? Quel moteur / version / mise en œuvre JS, quelles spécifications de la machine, quels cas de test, etc.?


@ggorlen en pensant à cette nouvelle fois, je me rends compte que l'efficacité rendra cela surcpliquée, alors j'ai simplement demandé différentes solutions possibles.


@ZiPzit by 'à l'index 2', je veux dire après l'index numéro 1. Voir Ma solution .


4 Réponses :


4
votes

J'ai monté une implémentation possible:

p>

// merge 'b' with 'a' at index 'i'
function merge(a, b, i=0) {
  return a.slice(0, i).concat(b, a.slice(i));
}

var result = merge([1, 2, 5], [3, 4], 2);
console.log(result);


2 commentaires

Je pense que cela est en fait le plus élégant, car il effectue le tout dans une ligne et ne modifie pas les matrices d'entrée.


@mbJ Je suis d'accord c'est de la manière facile à lire que tous les autres et utilise moins de code.



0
votes

Si le but est juste de les commander:

var array1 = [1, 2, 5],
  array2 = [3, 4];
let combineAt = (n, a, b) => a.reduce((ac, cv, ci) => (n === ci) ? (ac.push(b, cv), ac.flat()) : (ac.push(cv), ac), []);

let r = combineAt(2, array1, array2);

console.log(r);


1 commentaires

@Markmeyer ah, je pense que j'ai édité ce que tu parles de l'époque où j'ai vu ton commentaire :) Ce devrait être une réponse assez solide maintenant.



4
votes

Vous pouvez essayer Epanding B Code> S éléments dans épissure code> , qui ajoute une série d'arguments à l'index i code> (la suppression des arguments en option est ignorée avec 0 code>). A code> sera modifié en place et renvoyé.

p>

const merge = (a, b, i=0) => a.splice(i, 0, ...b) && a;

console.log(merge([1, 2, 5], [3, 4], 2));


4 commentaires

Cela mutera la matrice se passer dans la fonction, array1 sera identique au résultat après la fusion que je pense être fausse.


Je le mentionne dans ma réponse. La question ne fait pas de restriction sur la mutation des paramètres.


Oh oui, je vois que tu l'as mentionné. Même sans restrictions, je pense que c'est une mauvaise pratique de le faire. Pourquoi avez-vous eu la peine de rentrer quelque chose à partir de la fonction lorsque vous pouvez simplement faire fusion (array1, array2, 2); console.log (array1); alors?


OP a répondu à leur propre question et je voulais que ma fonction se comporte comme son exemple, en ligne et travaille avec la chaîne. Oui, les paramètres mutants ne sont pas bonnes pratiques dans tous les cas, mais encore une fois, cela n'a pas été mentionné comme une contrainte pour le problème. Si l'efficacité est la clé et que vous n'échonnez pas la mutation, la voie à suivre est de plop B au milieu de A . JS'S'S 'CODE> Array.Sort est un exemple de fonction en place qui muttaise et renvoie la matrice Arg (il s'agit d'une fonction prototype, oui).



2
votes

Si vous ne voulez pas muter le tableau d'origine, vous pouvez répandre des tranches dans un nouveau tableau:

p>

var array1 = [1, 2, 5];
var array2 = [3, 4];

function merge(a1, a2, i){
    return [...a1.slice(0,i), ...a2, ...a1.slice(i)]
}

console.log(merge(array1, array2, 2))

// negative indexing too
console.log(merge(array1, array2, -2))


1 commentaires

Nice utilisation de l'opérateur répandu au lieu de Concat! Celui-ci est mon préféré maintenant! :-)