2016-04-12 10 views
0

iが6 'のmyObjects' を有する 'myarrayの' 言うましょ別々のオブジェクト

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

によって移入オブジェクト

var myArray = [] 

の配列を持っている場合、それらの半分は同じidを共有しています。つまり、idで 'myObjects'を区切る関数が必要なので、分離するIDを必要とする別の関数に渡すことができます。

myArrayデータにはrythmeがあります。

例の2 * 3(6) 'myObjects' 半分シェア同様のID [ID:1、ID:2、ID:3、ID:1、ID:2、ID:3]

私は3つの配列にしたい。 [id:1、id:1] [id:2、id2] [id:3、id:3]

これを簡単かつ効率的に行う方法はありますか?

答えて

0

あなたはlodashを使用することができ、その方法は_.groupBy()です。このような何か:

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

(ところでテストしていません)

1

平野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

これを試してみて、出力は配列の配列です。

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

は最適化されたが、未作業例:

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}], [...], ...] 

フィドル:https://jsfiddle.net/zdtddc7f/

0

これはバニラJavaScriptバージョンがあり、それが片付けを行うことができますが、それは仕事をしていません。

それがないすべては最初loopプッシュにobjectidのために、あなたのarrayobjectsのループで一時的arrayidsを追跡するために)以降のすべての上に、中objectmasterArrで新しいarrayを作成loopこれは、同じidのエントリが存在するかどうかをチェックし、それが正しい場所に追加された場合は、objectの新しいarrayを作成し、idArridを再度追跡します。

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; 
} 

は、あなたはこれがグループ化されたidの項目への参照など、一時的なオブジェクトとの提案である。この

var mappedArray = filterArray(myArray); 

https://jsfiddle.net/m4x2boyw/

1

のようにそれを呼び出します。これと同様に

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

、ここで最高の1 +1 –

関連する問題