Bien que je sois sûr de ne pas trop compliquer les choses, je suis curieux de savoir comment je pourrais «réduire» un tableau en combinant toutes les chaînes adjacentes, mais en laissant les objets en tant qu'objets pour que:

array = ["I","want","to",[Obj],"come","together"]

Les sorties

["I want to", [Obj], "come together"];

J'ai l'impression que array.reduce() pourrait être le ticket ici, mais je suis toujours en train de tourner la tête autour de cette fonction.

2
Trees4theForest 31 mai 2020 à 00:09

3 réponses

Meilleure réponse

Réduisez la matrice. Si l'élément courant et le dernier élément de l'accumulateur (r) sont des chaînes, concaténez-les. Sinon, poussez l'élément actuel vers l'accumulateur:

const array = ["I","want","to",[{}],"come","together"]

const isString = s => typeof s === 'string'

const result = array.reduce((r, o) => {
  if(isString(o) && isString(r[r.length - 1])) {
    r[r.length - 1] = `${r[r.length - 1]} ${o}`
  } else {
    r.push(o)
  }

  return r
}, []) 

console.log(result)
3
Ori Drori 30 mai 2020 à 21:15

Au cas où vous voudriez aller avec le bon vieux for-loop :)

var result = [], array = ["I","want","to",{a: 1, b:2},"come","together"];
var i=0;var str = "";
for(; i< array.length; i++){
  if(typeof array[i] === 'object' ){
     result.push(str);
     result.push(array[i]);
     str="";
     
   }else{
    str = str+" "+ array[i];
  }
}
if(i==array.length){
  result.push(str);
}
console.log(result);
2
ABGR 30 mai 2020 à 21:27

Je ferais ceci:

const array = ["I","want","to",{},"come","together"];

let outputArr = [];
let strArr = [];

array.forEach(elem => {
  if (typeof elem === 'string') {
    return strArr.push(elem);
  }
  
  outputArr.push(strArr.join(' '));
  strArr = [];
  outputArr.push(elem);
});

outputArr.push(strArr.join(' '));

console.log(outputArr);
2
Cambrian Dream 30 mai 2020 à 21:23