2016-04-12 3 views
0

Wenn ich ein Array von Objektenseparate Objekte mit simular id in-Array in neue Array (s)

var myArray = [] 

Populated von

var myObject = { 
id: 1, 
name: 'example' 
} 

Sagen wir 'myArray' 6 'MyObjects', die Hälfte von ihnen teilen die gleiche ID, ich möchte eine Funktion, die "myObjects" durch ID trennt, so dass ich sie an eine andere Funktion weitergeben kann, die die ID benötigt, um getrennt zu werden.

Es gibt einen Rhythmus zu den myArray-Daten.

Beispiel 2 * 3 (6) 'MyObjects', wo die Hälfte teilt eine ähnliche ID: [id: 1, ID: 2, ID: 3, ID: 1, ID: 2, ID: 3]

Ich möchte das in 3 Arrays. [ID: 1, ID: 1] [ID: 2, ID2] [ID: 3, ID: 3]

Wie kann ich dies auf einfache und effiziente Weise tun?

Antwort

0

Sie könnten lodash verwenden und es ist _.groupBy() Methode. Etwa wie folgt:

const sorted = _.groupBy(myArray, 'id'); 

(BTW nicht getestet)

1

Ebene JS

var groupedById = arr.reduce((map,obj) => { 
    (map[obj.id] || (map[obj.id] = [])).push(obj); 
    return map; 
}); 
var itemsWithSameId = Object.keys(groupedById).map(id => groupedById[id]); 
0

Diese Versuchen, ausgegeben Array von Arrays.

var myArray = [ 
 
{id: 1,name: 'example'}, 
 
{id: 2,name: 'example'}, 
 
{id: 3,name: 'example'}, 
 
{id: 1,name: 'example'}, 
 
{id: 2,name: 'example'}, 
 
{id: 3,name: 'example'}, 
 
{id: 1,name: 'example'}, 
 
{id: 2,name: 'example'}, 
 
{id: 3,name: 'example'} 
 
] 
 

 
var tempObj = {}; 
 

 
$.each(myArray, function(index, value) { 
 
    if (!tempObj[value.id]) { 
 
    tempObj[value.id] = []; 
 
    } 
 
    tempObj[value.id].push(value); 
 
}); 
 

 
finalArray = [] 
 
$.each(tempObj, function(i, v) { 
 
    finalArray.push(v); 
 
}); 
 

 
document.write(JSON.stringify(finalArray));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

0

nicht optimiert, sondern Arbeitsbeispiel:

var array = [{id:1},{id:2},{id:3},{id:1},{id:2},{id:3}]; 

var resultObj = {}; 
var resultArray = []; 

array.forEach(function(x) { 
    //get the id 
    var id = x.id; 
    //if id is unknown, add new key to resultObj 
    if (!resultObj.hasOwnProperty(id)) { 
    resultObj[id] = []; 
    } 
    //add object to id 
    resultObj[id].push(x); 
}); 

//loop over resultObj keys 
for (var key in resultObj) { 
    if (resultObj.hasOwnProperty(key)) { 
    //push array to 2dArray 
    resultArray.push(resultObj[key]); 
    } 
} 

//show results 
console.log(resultObj);//{1:[{id:1}, {id:1}], 2:[...], ...]} 
console.log(resultArray);//[[{id:1}, {id:1}], [...], ...] 

Fiddle: https://jsfiddle.net/zdtddc7f/

0

dies ist ein Vanilla JavaScript-Version, kann es mit Aufräumen tun, aber es macht die Arbeit.

Alles, was es tut, ist Schleife Ihre array von objects zum ersten loop Push die id des object auf eine vorübergehende array (zu halten Spur des ids) ein neues array in masterArr mit dem object in, zu allen anderen loop es überprüft, ob ein Eintrag mit der gleichen id vorhanden ist und wenn es tut, fügt es an der richtigen Stelle an, ansonsten erstellt eine neue array mit der object und verfolgt die id in der idArr wieder.

function filterArray(arr) {  
    var masterArr = [], idArr = []; 
    for (var i = 0, len = arr.length; i < len; i++) { 
    if (i === 0) { 
     idArr.push(arr[i].id); 
     masterArr.push([arr[i]]); 
    } else { 
     var idCheck = idArr.indexOf(arr[i].id);   
     if (idCheck > -1) { 
     masterArr[idCheck].push(arr[i]); 
     } else { 
     idArr.push(arr[i].id); 
     masterArr.push([arr[i]]); 
     } 
    } 
    } 
    return masterArr; 
} 

dann rufen Sie es wie folgt

var mappedArray = filterArray(myArray); 

https://jsfiddle.net/m4x2boyw/

1

Dies ist ein Vorschlag mit einem temporären Objekt als Verweis auf das Element für die gruppierte ID.

var data = [{ id: 1 }, { id: 2 }, { id: 3 }, { id: 1 }, { id: 2 }, { id: 3 }], 
 
    result = []; 
 

 
data.forEach(function (a) { 
 
    if (!this[a.id]) { 
 
     this[a.id] = []; 
 
     result.push(this[a.id]); 
 
    } 
 
    this[a.id].push(a); 
 
}, {}); 
 

 
document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');

+1

, wie es am besten man hier +1 –