javascript - Vytvorte objekt z poľa reťazcov


Snažím sa vytvoriť objekt z poľa reťazcov.

Mám toto pole reťazcov:

let BaseArray = ['origin/develop', 'origin/master', 'toto/branch', 'tata/hello', 'tata/world'];

a chcel by som mať taký objekt :

{
  origin : ['develop', 'master'],
  toto : ['branch'],
  tata : ['hello', 'world']
}

Takže zatiaľ som urobil toto:

let Obj = {};
let RemoteObj = {};
for (let CurrentIndex = 0; CurrentIndex < BaseArray.length; CurrentIndex++) {
    let Splits = BaseArray[CurrentIndex].split('/');
    if (Splits[0] && Splits[1]) {
        Obj[Splits[0]] = Splits[1].trim();
    }

    if (this.isObjectEmpty(RemoteObj)) {
        RemoteObj = Obj;
    } else {
        RemoteObj = this.mergeObjects(RemoteObj, Obj);
    }
    console.log(RemoteObj);
}

A moje utilitné funkcie sú :

mergeObjects(...objs) {
  let Result = {}, Obj;

  for (let Ind = 0, IndLen = objs.length; Ind < IndLen; Ind++) {
    Obj = objs[Ind];

    for (let Prop in Obj) {
      if (Obj.hasOwnProperty(Prop)) {
        if (!Result.hasOwnProperty(Prop)) {
          Result[Prop] = [];
        }
        Result[Prop].push(Obj[Prop]);
      }
    }
  }

  return Result;
}

isObjectEmpty(Obj) {
  for (let Key in Obj) {
    if (Obj.hasOwnProperty(Key)) {
      return false;
    }
    return true;
  }
}

Som si istý, že existuje lepšie riešenie, ako to urobiť, ale ja to nedokážem. Takže som otvorený akejkoľvek pomoci!

Vopred ďakujem!

Odpoveď č. 1

Môžete použiť Array.reduce() na vytvorenie objektu rozdelením každého reťazca na kľúč a hodnotu, priradením prázdneho poľa ku kľúču, ak neexistuje, a pridaním hodnoty do poľa:

const BaseArray = ['origin/develop', 'origin/master', 'toto/branch', 'tata/hello', 'tata/world'];

const result = BaseArray.reduce((r, str) => {
  const [key, value] = str.split('/');
  
  if(!r[key]) r[key] = [];
  
  r[key].push(value);
  
  return r;
}, {});

console.log(result);

Odpoveď č. 2

Na tento prístup môžete použiť Array.reduce(). Pri každej iterácii reduce môžete rozdeliť svoj reťazec podľa / a použiť prvok ako key v novom objekte a potom vložiť druhý prvok do poľa priradeného k tomuto key:

let BaseArray = ['origin/develop', 'origin/master', 'toto/branch', 'tata/hello', 'tata/world'];

let res = BaseArray.reduce((acc, curr) =>
{
    let [k, v] = curr.split("/");
    (acc[k] = acc[k] || []).push(v);
    return acc;
}, {});

console.log(res);
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}

Súvisiace články