2017-06-12 1 views
1

Mit einem Objekt, das ich klonen & hinzufügen:Clone Array mit gespreizten Operator und fügen Inline

let newObject = { 
     ...obj, 
     [key]: { 
     ...obj[key], 
     thing: true } 
    } 

Also, das einige Objekte auf ein Array hinzufügt, dann ein Objekt der Eigenschaft aktualisiert wird. Ich kenne den zu aktualisierenden Index des Elements, möchte jedoch vorhandene Eigenschaften nicht überschreiben.

Jetzt möchte ich für Array, das Gleiche tun:

let newArray = [ 
    ...arr, 
    [key]: { 
     ...arr[key], 
     thing: true } 
    ] 

die die gleichen wie oben tun könnte.

Aber das funktioniert nicht.

Sollte {key}:thing funktionieren? Ich erinnere mich, irgendwo gelesen zu haben, vielleicht seine ES7?

ich tun konnte:

let newArray = arr.map((item, key) => key === index ? { ...item, thing: true } : item); 

Aber ich war für eine saubere Syntax der Hoffnung. Ich werde keine akzeptieren, wenn es keine ähnliche Syntax gibt.

+0

Nein, es sei denn, Sie wollen anhängen/ein Element dem Array voranstellen, verwenden Sie 'map'. Oder Array mit zwei Scheiben verteilt. – Bergi

+4

Sie verwechseln Arrays und Objekte. – SLaks

+1

'[Schlüssel]: Thing' ist kein Array-Element. – wostex

Antwort

0

Arrays haben keine Schlüssel, daher funktioniert die von Ihnen verwendete Syntax nicht. Ist es eine Anordnung von Objekten? Wenn ja ...

EDIT - basierend auf Ihren Kommentar, versuchen Sie dies:

// if you know the index of the object you'd like to modify 
let newArray = [ 
    ...arr 
] 
newArray[idx][key] = thing 

// if you don't know the index 
let newArray = [ 
    ...arr 
] 
newArray.map((el) => { 
    if (/* YOUR LOGIC HERE TO DETERMINE IF THIS IS THE OBJECT TO MODIFY! */) { 
     return el[key] = thing 
    } else { 
     return el 
    } 
}) 

// if you want it done in one function... 
let newArray = [] 
arr.map((el) => { 
    if (el[key]) { 
     newArray.push(Object.assign({}, { [key]: thing })) 
     return el 
    } else { 
     newArray.push(Object.assign({}, el)) 
     return el 
    } 
}) 
+0

Ich muss auf den Index eines bestimmten Objekts im Array zugreifen und nur die Eigenschaft dieses Objekts aktualisieren, nachdem es in das neue Array eingefügt wurde. – TrySpace

+0

@TrySpace, sehen, ob meine Bearbeitung Ihre Bedürfnisse adressiert – Adam

+0

Ich bin sicher, dass OP weiß, dass dies auf diese Weise getan werden kann, aber ich denke, dass sie nach einer Einzeiligen (d. H. Ein Ausdruck) Lösung suchen. –

1

Sie Object.assign() verwenden können:

const arr = [{ a: 1 }, { b: 1 }, { c: 1 }]; 
 
const index = 1; 
 

 
const newArr = Object.assign([], arr, { [index]: { ...arr[index], thing: true } }); 
 
console.log(newArr);

+0

@TrySpace Siehe meine aktualisierte Antwort. –