2017-10-28 28 views
1

Ich versuche, einige elegante Lösung, wie Werte der Objekteigenschaften zusammenführen, wenn der Name derselbe ist.Javascript - merge Eigenschaften eines Objekts

Beispiel:

var object = { 
"10-10-2017": "Black friday", 
"11-09-2017": "Some holiday", 
"10-10-2017": "Fathers day" 
} 

Merge:

var object = { 
"10-10-2017": "Black friday Fathers day", 
"11-09-2017": "Some holiday", 
} 

ich dieses Objekt als Futter für den Kalender verwenden, wo Eigenschaftsnamen Datum und Eigenschaftswert ist/sind Ereignisse für das Datum und meine Lösung kann nicht zwei Eigenschaften mit demselben Namen behandeln. Dieser Feed wird von der Vorlagen-Engine generiert und kann nicht nur so gerendert werden (für jeden Kontext eines Ereignisses fügt er dem Objekt eine Zeile hinzu), wenn eine Ansicht gerendert wird.

Für diejenigen, die Kentico CMS kennen, verwende ich Repeater mit Wirkung, um dieses Objekt zu erstellen, wobei "var object = {" ist HTML-Umschlag vor und "}" ist HTML-Umschlag nach.

+6

Ihre erste Aufgabe ist es kein gültiges Objekt. Sie können nicht zwei Schlüssel mit demselben Namen haben. – Xufox

+1

^^ Der Objektinitialisierer ist gültig, aber das Objekt endet nur mit zwei Eigenschaften, "10-10-2017" = "Vatertag" und "11-09-2017" = "Einige Ferien". Wenn Sie dieselbe Eigenschaft mehr als einmal in einem Initialisierer auflisten, gewinnt der letzte. Wir können Ihnen also nicht helfen, da das beschriebene Quellobjekt nur zwei, nicht drei Eigenschaften hat. Es gibt nichts zu verschmelzen. –

+0

Wie sind Ihre Daten in diesen Zustand geraten? Wahrscheinlich müssen Sie die Duplizierung vor dem Erstellen von Objekten lösen. –

Antwort

0

Zum ersten bearbeiten Ich schlage vor, dass Sie Ihr Objekt in eine andere Form ändern von

var object = { 
"10-10-2017": "Black friday", 
"11-09-2017": "Some holiday", 
"10-10-2017": "Fathers day" 
} 

zu

var object =[ 
{"date":"10-10-2017","value":"Black friday"}, 
{"date":"11-09-2017","value":"Some holiday"}, 
{"date":"10-10-2017","value":"Fathers day"} 
] 

Wenn das Ihnen hilft hier ist die Arbeitslösung

var object = [{date:"10-10-2017",value:"Black friday"},{date:"11-09-2017",value:"Some holiday"},{date:"10-10-2017",value:"Fathers day"}]; 
 

 
var output =[]; 
 

 
object.forEach(function(value) { 
 
    var existing = output.filter(function(v, i) { 
 
    return v.date == value.date; 
 
    }); 
 
    if (existing.length) { 
 
    var existingIndex = output.indexOf(existing[0]); 
 
    output[existingIndex].value += ' '+value.value 
 
    
 
    } else { 
 
    if (typeof value.value == 'string') 
 
     value.value = value.value; 
 
    output.push(value); 
 
    } 
 
}); 
 

 
console.log(JSON.stringify(output)); //returns [{"date":"10-10-2017","value":"Black friday Fathers day"},{"date":"11-09-2017","value":"Some holiday"}]

-3

Zunächst ist Ihr Code nicht korrekt, da JS nur die letzte Requisite aufnimmt, wenn der Name gleich ist.

> var object = { 
... "10-10-2017": "Black friday", 
... "11-09-2017": "Some holiday", 
... "10-10-2017": "Fathers day" 
... } 
undefined 
> object 
{ '10-10-2017': 'Fathers day', '11-09-2017': 'Some holiday' } 
> 

Aber

Für die zusätzliche Stütze, gibt es eine Lösung, hoffe das hilft dir, zum Beispiel

Ihre
object[newProperty] = (object[newProperty] || '') + newValue; 
0

Falls die question from my comment Antworten mit Ja, das möglicherweise einen Arbeitsansatz bietet ...

// BEGIN of CMS templating ... 
 

 
var descriptorList = []; 
 

 
// programmatically push into a list of property descriptors, 
 
// each descriptor holding just one key value pair. 
 

 

 
    // +++ BEGIN iteration here ... 
 

 
    descriptorList.push({ "10-10-2017": "Black friday" }); 
 
    // ... 
 
    // ... keep looping ... "Kentico CMS repeater"? 
 

 

 
    // for the sake of providing a working example 
 
    // there will be some more descriptors pushed ... 
 

 
    descriptorList.push({ "11-09-2017": "Some holiday" }); 
 
    descriptorList.push({ "10-10-2017": "Fathers day" }); 
 

 
    // ... END of iteration. +++ 
 

 

 
function mergeObjectsAndConcatSamePropertyStringTypes(a, b) { 
 
    var 
 
    type = Object.assign({}, a, b);  // - start with a raw merged type (merger). 
 

 
    Object.keys(b).filter(function (key) { // - collect `key` duplicates. 
 
    return (key in a); 
 
    }).forEach(function (key) {    // - for each duplicate `key` that targets 
 
    var aValue = a[key];     // a string type at each object, do concat 
 
    var bValue = b[key];     // this values and assign it to the merger. 
 
    if ((typeof aValue == 'string') &&/*||*/ (typeof bValue == 'string')) { 
 
     type[key] = [aValue, bValue].join(' '); 
 
    } 
 
    }); 
 

 
    return type; 
 
} 
 

 
// assembling of the desired type ... 
 
var type = descriptorList.reduce(mergeObjectsAndConcatSamePropertyStringTypes, {}); 
 

 
// END of CMS templating ... 
 

 

 
console.log('descriptorList : ', descriptorList); 
 
console.log('type : ', type);
.as-console-wrapper { max-height: 100%!important; top: 0; }

Verwandte Themen