2016-06-11 8 views
-1

Ich habe viele andere Fragen im Zusammenhang mit js Objektsortierung gesehen, von denen die meisten vorschlagen, die .map Methode zu verwenden, um ein Objekt oder ein Array von Objekten basierend auf dem Wert von zu sortieren eine Eigenschaft, aber ich versuche, etwas etwas anderes zu erreichen.JS Objekttransformation basierend auf Werten von Objekteigenschaften

Ich versuche, dieses Objekt Format zu drehen:

{ 
    "commits": [ 
     { 
      "repository": "example-repo-1", 
      "commit_hash": "example-hash-1" 
     }, 
     { 
      "repository": "example-repo-1", 
      "commit_hash": "example-hash-1.2" 
     }, 
     { 
      "repository": "example-repo-2", 
      "commit_hash": "example-hash-2" 
     } 
    ] 
} 

in ein Objekt den Wert von ‚Repository‘ formatiert wie folgt aus:

{ 
    "example-repo-1": [ 
     { 
      "repository": "example-repo-1", 
      "commit_hash": "example-hash-1" 
     }, 
     { 
      "repository": "example-repo-1", 
      "commit_hash": "example-hash-1.2" 
     } 
    ], 
    "example-repo-2": [  
     { 
      "repository": "example-repo-2", 
      "commit_hash": "example-hash-2" 
     } 
    ] 
} 

Also muss ich meine ursprüngliche Objekt erhalten , das ein Objekt mit einem Array anderer Objekte ist, um ein Objekt zurückzugeben, das zahlreiche Arrays enthält, die nach den Werten der Repository-Eigenschaft benannt sind und jedes Objekt enthalten, das mit diesem Eigenschaftswert übereinstimmt.

Antwort

2

Verwendung Array#forEach Methode

var data = { 
 
    "commits": [{ 
 
    "repository": "example-repo-1", 
 
    "commit_hash": "example-hash-1" 
 
    }, { 
 
    "repository": "example-repo-1", 
 
    "commit_hash": "example-hash-1.2" 
 
    }, { 
 
    "repository": "example-repo-2", 
 
    "commit_hash": "example-hash-2" 
 
    }] 
 
}; 
 

 
var res = {}; 
 

 
data.commits.forEach(function(v) { 
 
    // define the pproperty if already not defined 
 
    res[v.repository] = res[v.repository] || []; 
 
    // push the reference to the object or recreate depense on your need 
 
    res[v.repository].push(v); 
 
}) 
 

 
console.log(res);


oder mit Array#reduce Methode

var data = { 
 
    "commits": [{ 
 
    "repository": "example-repo-1", 
 
    "commit_hash": "example-hash-1" 
 
    }, { 
 
    "repository": "example-repo-1", 
 
    "commit_hash": "example-hash-1.2" 
 
    }, { 
 
    "repository": "example-repo-2", 
 
    "commit_hash": "example-hash-2" 
 
    }] 
 
}; 
 

 
var res = data.commits.reduce(function(obj, v) { 
 
    // define property if not defined 
 
    obj[v.repository] = obj[v.repository] || []; 
 
    // push the object 
 
    obj[v.repository].push(v); 
 
    // return the result object 
 
    return obj; 
 
}, {}) 
 

 
console.log(res);

-1

Probieren Sie etwas wie dieses

var input = { 
 
    "commits": [ 
 
     { 
 
      "repository": "example-repo-1", 
 
      "commit_hash": "example-hash-1" 
 
     }, 
 
     { 
 
      "repository": "example-repo-1", 
 
      "commit_hash": "example-hash-1.2" 
 
     }, 
 
     { 
 
      "repository": "example-repo-2", 
 
      "commit_hash": "example-hash-2" 
 
     } 
 
    ] 
 
}; 
 

 
var output = {}; 
 

 
input.commits.forEach(function(el){ 
 
    if(!output[el.repository]) 
 
    output[el.repository] = []; 
 
    output[el.repository].push[el]; 
 
    }) 
 
console.log(output);