Vyhledávání na webu

javascript - Sloučit objekt s Object.assign přepsat vnitřní objekt bez sloučení


Mám dva objekty, které chci sloučit do nového objektu, první objekt je pro výchozí možnosti pro graf Google:

optionsA = {
    height: 500,
    focusTarget: 'category',
    hAxis: {
      showTextEvery: 0,
      slantedText: true,
      slantedTextAngle: 45,
      format: 'date',
    },
}

Se svým druhým objektem chci přidat některé vlastnosti do hAxis a přepsat současné možnosti novými hodnotami, ale chci zachovat výchozí možnosti v optionsA.

Toto je můj druhý objekt:

optionsA = {
    isStacked: true,
    hAxis: {
      gridlines: {
        count: 10
      },
      format: 'percent',
    },
}

Tyto objekty jsou složitější, ale vlastnosti zjednodušuji, aby byla otázka jednodušší

Když se pokusím sloučit pomocí object.assign, výsledkem je, že objekt B přidá nové hlavní vlastnosti do nového objektu, ale vlastnosti v hAxis jsou úplně přepsány možnostmi v optionsB.

let newObj = Object.assign({}, optionsA, optionsB);

Toto je objekt, který očekávám:

{
    height: 500,
    focusTarget: 'category',    
    isStacked: true,
    hAxis: {
      gridlines: {
         count: 10
      },
      format: 'percent',
      showTextEvery: 0,
      slantedText: true,
      slantedTextAngle: 45,
    },
}

ale místo toho dostávám toto:

{
    height: 500,
    focusTarget: 'category',    
    isStacked: true,
    hAxis: {
       gridlines: {
         count: 10
       },
       format: 'percent',
    },
}

Vlastnosti v hAxis jsou zcela přepsány novými vlastnostmi, co je špatně s mým přístupem?

Odpověď č. 1

Pokud není vnoření hluboké, můžete proces sloučení rozdělit do dvou kroků následujícím způsobem:

optionsA = {
    height: 500,
    focusTarget: 'category',
    hAxis: {
      showTextEvery: 0,
      slantedText: true,
      slantedTextAngle: 45,
      format: 'date',
    }
};

optionsB = {
    isStacked: true,
    hAxis: {
      gridlines: {
        count: 10
      },
      format: 'percent',
    }
};

let newNestedMerged = Object.assign({},optionsA.hAxis, optionsB.hAxis);
optionsA.hAxis = newNestedMerged;
optionsB.hAxis = newNestedMerged;
let newObj =  Object.assign(optionsA, optionsB);
console.log(newObj);

Pomáhá to?

Odpověď č. 2

Protože máte stejnou vlastnost v obou objektech.

Vlastnosti jsou přepsány jinými objekty, které mají stejné vlastnosti později v pořadí parametrů.

Podívejme se na příklad použití assign na MDN.

Můj návrh je nejprve sloučit stejné vlastnosti.

optionsA = {
    height: 500,
    focusTarget: 'category',
    hAxis: {
      showTextEvery: 0,
      slantedText: true,
      slantedTextAngle: 45,
      format: 'date',
    },
}
optionsB = {
    isStacked: true,
    hAxis: {
      gridlines: {
        count: 10
      },
      format: 'percent',
    },
}
Object.assign(optionsA.hAxis, optionsB.hAxis);
let newObj = Object.assign({}, optionsB, optionsA);
console.log(newObj);

Související články