2017-07-11 1 views
0

維持しながら、この中グループとJavascriptでソートJSON私はJSONのこの種の変換する方法を探しています、元のキー

{ 
 
    "component-0":{ 
 
    "parent":"grid-item-0", 
 
    "position":1 
 
    }, 
 
    "component-1":{ 
 
    "parent":"grid-item-0", 
 
    "position":0 
 
    }, 
 
    "component-2":{ 
 
    "parent":"grid-item-1", 
 
    "position":0 
 
    } ... 
 
}

は(「親」でグループ化され、それはimportanだと

{ 
 
    "grid-item-0":[ 
 
     { 
 
     "id":"component-1", 
 
     "parent":"grid-item-1", 
 
     "position":0 
 
     }, 
 
     { 
 
     "id":"component-0", 
 
     "parent":"grid-item-0", 
 
     "position":1 
 
     } 
 
    ], 
 
    "grid-item-1":[ 
 
     { 
 
     "id":"component-2", 
 
     "parent":"grid-item-1", 
 
     "position":0 
 
     } 
 
    ] ... 
 
}

注: "位置")によってソートグループ化して元のキー/識別子(「コンポーネント0」など)を保持する。私はunderscore groupByメソッドを試しましたが、それは私のIDを数値で置き換えます。

ありがとうございます!

答えて

3

var obj = { 
 
    "component-0":{ 
 
    "parent":"grid-item-0", 
 
    "position":1 
 
    }, 
 
    "component-1":{ 
 
    "parent":"grid-item-0", 
 
    "position":0 
 
    }, 
 
    "component-2":{ 
 
    "parent":"grid-item-1", 
 
    "position":0 
 
    } 
 
} 
 

 
_.each(obj, (v, k) => v.id = k) 
 
var grouped = _.groupBy(obj, 'parent'); 
 
var sorted = _.mapObject(grouped, v => _.sortBy(v,'position')) 
 
console.log(sorted)
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>

+0

おかげで、それは魔法のように動作します! – user2307798

0

バニラJS溶液:

まずがidそれぞれに追加して、オブジェクトの配列に元のオブジェクトを変換する必要があります

var objects = Object.keys(original_object). 
    reduce(function(arr, key) { 
    arr.push(
     Object.assign({}, original_object[key], { id: key }) 
    ); 
    return arr; 
    }, []); 

これにより、以下の構造の配列が得られます。

enter image description here

その後、我々ソートobjects位置によって:parentによって

var sorted_objects = objects.sort(function(a, b) { 
    return a.position >= b.position ? 1 : -1; 
}); 

最後に、私たちのグループのオブジェクトを:

var groups = sorted_objects.reduce(function(res, item) { 
    res[item.parent] = res[item.parent] || []; 
    res[item.parent].push(item); 
    return res; 
}, {}); 

最終結果:

enter image description here


最終的なコード:

var original_object = { 
 
    "component-0":{ 
 
    "parent":"grid-item-0", 
 
    "position":1 
 
    }, 
 
    "component-1":{ 
 
    "parent":"grid-item-0", 
 
    "position":0 
 
    }, 
 
    "component-2":{ 
 
    "parent":"grid-item-1", 
 
    "position":0 
 
    } 
 
} 
 

 
var objects = Object.keys(original_object). 
 
    reduce(function(arr, key) { 
 
    arr.push(
 
     Object.assign({}, original_object[key], { id: key }) 
 
    ); 
 
    return arr; 
 
    }, []); 
 

 
var sorted_objects = objects.sort(function(a, b) { 
 
    return a.position >= b.position ? 1 : -1; 
 
}); 
 

 
var groups = sorted_objects.reduce(function(res, item) { 
 
    res[item.parent] = res[item.parent] || []; 
 
    res[item.parent].push(item); 
 
    return res; 
 
}, {}); 
 

 
console.log(groups);

+0

すばやく詳細な返信をありがとうございました。私が望んでいたものとまったく同じように見える、できるだけ早くこれを試みる。 – user2307798

+0

とにかくunderscore.jsが含まれている場合は、代わりに@ juvianの解決策を使用してください。これははるかに簡潔です。 –

関連する問題