2016-08-06 25 views
2

Ich habe ein Array von Objekten, die wie folgt aussieht:Update-Array von Objekten in JavaScript/jquery wo feldspezifische Wert ist

var finishes = [ 
    {label:'Raw Steel'}, 
    {label:'Antique Pewter'}, 
    {label:'Barn Red'}, 
    {label:'Brushed Stainless Steel'}, 
    {label:'Brushed Steel'}, 
    {label:'Copper Patina'}, 
    {label:'Dark Bronze'}, 
    {label:'Distressed White'}, 
    {label:'Flat Black'}, 
    {label:'Green Patina'}, 
    {label:'Oil Rubbed Bronze'}, 
    {label:'White'}, 
    {label:'Warehouse Bronze'}, 
    {label:'Weathered Rust'}, 
]; 

var wheelFinishes = finishes; 

Wie Sie ein anderes Array von Objekten sehen kann ich Setup, die einige haben wird verschiedene Attribute dann das "Seed" -Array von Objekten.

Also, was ich tun möchte, ist so etwas wie:

UPDATE wheelFinishes WHERE label="Barn Red" SET exclusion="Metal Values"

So wird der Wert von wheelFinishes enden würde wie:

var wheelFinishes = [ 
    {label:'Raw Steel'}, 
    {label:'Antique Pewter'}, 
    {label:'Barn Red', exclusion:'Metal Values'}, 
    {label:'Brushed Stainless Steel'}, 
    {label:'Brushed Steel'}, 
    {label:'Copper Patina'}, 
    {label:'Dark Bronze'}, 
    {label:'Distressed White'}, 
    {label:'Flat Black'}, 
    {label:'Green Patina'}, 
    {label:'Oil Rubbed Bronze'}, 
    {label:'White'}, 
    {label:'Warehouse Bronze'}, 
    {label:'Weathered Rust'}, 
]; 

ich auf der tatsächlichen Syntax bin nicht sicher zu Aktualisieren Sie ein Array von Objekten in Javascript.

Ich weiß, dass Unterstriche einige Funktionen haben können, die diese Art von Sache einfacher machen, also bin ich offen für eine Lösung in Unterstrichen, wenn das überhaupt möglich ist?

+2

arbeitet Dies kann https://developer.mozilla.org/en-US/ docs/Web/JavaScript/Referenz/Global_Objects/Array/finde –

Antwort

2

Durch das Array Iterieren und eine Eigenschaft anhängen.

Verwenden Sie eine Funktion update. Ich akzeptiere, dass ein Satz von Etikettenelementen modifiziert werden muss. Unter jeder Etikettengruppe gibt es eine weitere anzuhängende Menge.

var finishes = [{ 
 
    label: 'Raw Steel' 
 
}, { 
 
    label: 'Antique Pewter' 
 
}, { 
 
    label: 'Barn Red' 
 
}, { 
 
    label: 'Brushed Stainless Steel' 
 
}, { 
 
    label: 'Brushed Steel' 
 
}, { 
 
    label: 'Copper Patina' 
 
}, { 
 
    label: 'Dark Bronze' 
 
}, { 
 
    label: 'Distressed White' 
 
}, { 
 
    label: 'Flat Black' 
 
}, { 
 
    label: 'Green Patina' 
 
}, { 
 
    label: 'Oil Rubbed Bronze' 
 
}, { 
 
    label: 'White' 
 
}, { 
 
    label: 'Warehouse Bronze' 
 
}, { 
 
    label: 'Weathered Rust' 
 
}, ]; 
 

 
function update(arr) { 
 
    var i, len, len2, len3, elem, j, k, key, value; 
 
    for (i = 0, len = arr.length; i < len; i += 1) { 
 
    elem = arr[i]; 
 
    for (j = 0, len2 = finishes.length; j < len2; j += 1) { 
 
     if (finishes[j].label === elem.label) { 
 
     for (k = 0, len3 = elem.set.length; k < len3; k += 1) { 
 
      key = elem.set[k].key; 
 
      value = elem.set[k].value; 
 
      finishes[j][key] = value; 
 
     } 
 
     } 
 
    } 
 
    } 
 
    return finishes; 
 
} 
 

 
console.log(update([{ 
 
    label: 'Barn Red', 
 
    set: [{ 
 
    key: 'exclusion1', 
 
    value: 'Metal Values1' 
 
    }, { 
 
    key: 'exclusion2', 
 
    value: 'Metal Values2' 
 
    }] 
 
}]));

+0

Ich versuche, eine Funktion zu schreiben, die dies für eine Vielzahl von verschiedenen Anwendungen wirklich schnell erledigen kann. – Jordash

+0

Yeah hat das nur aktualisiert, check ... wir können es mehr machen verallgemeinern ... – Ayan

+0

@Jordash Jetzt überprüfen, es ist jetzt vollständig verallgemeinert. Feed es dynamisch. Überprüfen Sie die Verwendung der Update-Funktion. Sie fragen mich, finden Sie diese Etiketten, unter jedem Satz von Etiketten, setzen Sie diese Sätze von Eigenschaften. – Ayan

1

könnten Sie zum Beispiel eine regelmäßige forEach dafür:

var finishes = [ 
 
    {label:'Raw Steel'}, 
 
    {label:'Antique Pewter'}, 
 
    {label:'Barn Red'}, 
 
    {label:'Brushed Stainless Steel'}, 
 
    {label:'Brushed Steel'}, 
 
    {label:'Copper Patina'}, 
 
    {label:'Dark Bronze'}, 
 
    {label:'Distressed White'}, 
 
    {label:'Flat Black'}, 
 
    {label:'Green Patina'}, 
 
    {label:'Oil Rubbed Bronze'}, 
 
    {label:'White'}, 
 
    {label:'Warehouse Bronze'}, 
 
    {label:'Weathered Rust'}, 
 
]; 
 
    
 
finishes.forEach(function(f) { 
 
    if(f.label === 'Barn Red') { 
 
    f.exclusion = 'Metal Values'; 
 
    } 
 
}); 
 
    
 
console.log(finishes);

2

Array.prototype.map eine (von mehreren) mögliche Lösung wäre, mit:

var wheelFinishes = [ 
 
    {label:'Raw Steel'}, 
 
    {label:'Antique Pewter'}, 
 
    {label:'Barn Red'}, 
 
    {label:'Brushed Stainless Steel'}, 
 
    {label:'Brushed Steel'}, 
 
    {label:'Copper Patina'}, 
 
    {label:'Dark Bronze'}, 
 
    {label:'Distressed White'}, 
 
    {label:'Flat Black'}, 
 
    {label:'Green Patina'}, 
 
    {label:'Oil Rubbed Bronze'}, 
 
    {label:'White'}, 
 
    {label:'Warehouse Bronze'}, 
 
    {label:'Weathered Rust'}, 
 
]; 
 

 
//extend all objects having a specific label 
 
updatedFinishes = wheelFinishes.map(function(obj) { 
 
    if(obj.label === 'Barn Red') { 
 
    obj.exclusion = 'Metal Values'; 
 
    } 
 
    return obj; 
 
}); 
 
    
 
//test 
 
updatedFinishes.forEach(function(obj) { 
 
    console.log(obj); 
 
})

2

Beachten Sie, dass, anders als Karte(), das funktioniert nur fo r das erste Element mit {label: 'Barn Red'} in einem Array.

Wie @RobertRocha vorgeschlagen:

var wheelFinishes = finishes.slice(); 
wheelFinishes.find(function (finish) { 
    return finish.label === 'Barn Red'; 
}).exclusion = 'Metal Values'; 

Diese copies das Array slice verwendet, dann finds das Element mit .label === 'Barn Red'.


In ES6:

const wheelFinishes = finishes.slice(); 
wheelFinishes 
    .find(finish => finish.label === 'Barn Red') 
    .exclusion = 'Metal Values'; 
2

Um es als kompatibel zu machen mit Ihrem Konzept der

UPDATE wheelFinishes WHERE label = "Barn Red" SET-Ausschluss = "Metal Values"

und es so lose wie möglich zu machen ble, hier ist eine Funktion, die Ihnen helfen könnten:

var finishes = [ 
    {label:'Raw Steel'}, 
    {label:'Antique Pewter'}, 
    {label:'Barn Red'}, 
    {label:'Brushed Stainless Steel'}, 
    {label:'Brushed Steel'}, 
    {label:'Copper Patina'}, 
    {label:'Dark Bronze'}, 
    {label:'Distressed White'}, 
    {label:'Flat Black'}, 
    {label:'Green Patina'}, 
    {label:'Oil Rubbed Bronze'}, 
    {label:'White'}, 
    {label:'Warehouse Bronze'}, 
    {label:'Weathered Rust'}, 
    ]; 

    var wheelFinishes = finishes; 

    function update(table, searchItem, setValue) { 
     function search(table) { 
      if(table.label == searchItem) { 
       table.exclusion = setValue; 
      } 
     } 

     table.find(search); 
    } 

    update(wheelFinishes, 'Barn Red', 'Metal Values'); 

    console.log(wheelFinishes[2]); 

Ergebnis: `` mit .find werden() Object {label: "Barn Red", exclusion: "Metal Values"}