2016-03-22 9 views
0

要約:マルチレベルの親子コメントシステムがあります。Javascript - ネストされた値によるJSONオブジェクトのソート

例:

comment 1 
    comment 1-1 
     comment 1-1-1 
    comment 1-2 
     comment 1-2-1 
      comment 1-2-2 
ここ

comment 1が親であるとcomment 1-1 & comment 1-2の両方であるようにcomment 1との子...

R等価:

property value .i.eに基づいてオブジェクト全体のsortingを達成したいと考えています。 timestamp(最新のコメントまたは返信が上に表示されます)。

JSONオブジェクト:私はこれまで試した

{ 
    "CommentText": "", 
    "CommentCreateStamp": "2016-03-22", 
    "Comments": [{ 
    "CommentText": "comment 1", 
    "CommentCreateStamp": "2016-03-09", 
    "Comments": [{ 
     "CommentText": "comment 1-1", 
     "CommentCreateStamp": "2016-03-15", 
     "Comments": [{ 
     "CommentText": "comment 1-1-1", 
     "CommentCreateStamp": "2016-03-21", 
     "Comments": null 
     }] 
    }] 
    }], 
    "Comments": [{ 
    "CommentText": "comment 2", 
    "CommentCreateStamp": "2016-03-12", 
    "Comments": [{ 
     "CommentText": "comment 2-1", 
     "CommentCreateStamp": "2016-03-10", 
     "Comments": [{ 
     "CommentText": "comment 2-1-1", 
     "CommentCreateStamp": "2016-03-14", 
     "Comments": null 
     }] 
    }] 
    }] 
} 

JSfiddleは:https://jsfiddle.net/asceeevb/

私はstackoverflowの上の質問をたくさん見たが要件ごとに機能していません。

すぐれたヘルプは、いずれも非常に高い評価を受けます。おかげ

+0

ので、あなたがフラットなリストをしたいですか? – georg

+0

構造が残っている必要がある場合は、同じレベルでのみソートできます。 –

+0

@georgであり、フラットリストではありません。私は 'CommentCreateStamp'プロパティに基づいてソートされた方法でデータを必要とします。最新のコメントは上部にも子階層と同じに来るべきです。私はJSONオブジェクトを更新しました。今すぐご確認ください。 –

答えて

2

私はあなたが求めているものを全くわからないが、そこにあなたのコードと違って見える物事のカップル:

  • あなたは、おそらくあなたは、配列を望んでいた、オブジェクトのcommentsプロパティを再定義しましたか?
  • ソート関数は、要素の比較に基づいて値を返し、出力しません。日付比較については、this SO questionを参照してください。

更新:あなたはあなたが欠落していたものを、接近していた、ネストされたコメントのsortingへの呼び出しでした。

var people = { 
 
    "CommentText": "", 
 
    "CommentCreateStamp": "", 
 
    "Comments": [{ 
 
    "CommentText": "c1", 
 
    "CommentCreateStamp": "2016-03-23 06:05:36", 
 
    "Comments": [{ 
 
     "CommentText": "c2", 
 
     "CommentCreateStamp": "2016-03-23 06:05:59", 
 
    }], 
 
    }, { 
 
    "CommentText": "a1", 
 
    "CommentCreateStamp": "2017-03-23 06:05:45", 
 
    "Comments": [{ 
 
     "CommentText": "a2", 
 
     "CommentCreateStamp": "2016-03-23 06:06:05", 
 
    }, { 
 
     "CommentText": "a3", 
 
     "CommentCreateStamp": "2016-03-23 06:06:16", 
 
    }, { 
 
     "CommentText": "a4", 
 
     "CommentCreateStamp": "2016-03-23 06:06:23", 
 
    }], 
 
    }], 
 
}; 
 

 

 

 
function sorting(js_object, key_to_sort_by) { 
 

 
    function sortByKey(a, b) { 
 
    var x = a[key_to_sort_by]; 
 
    var y = b[key_to_sort_by]; 
 
    return ((x < y) ? 1 : ((x > y) ? -1 : 0)); 
 
    }; 
 

 
    js_object.sort(sortByKey); 
 

 
}; 
 

 
function sortComments(comments) { 
 
    
 
    sorting(comments, 'CommentCreateStamp'); 
 
    for (var i = 0; i < comments.length; i++) 
 
    if (comments[i].hasOwnProperty('Comments')) 
 
     sortComments(comments[i].Comments); 
 

 
}; 
 

 
sortComments(people.Comments); 
 
console.log(people.Comments);

+0

フィディドを更新して確認してください。 –

+0

@RohitJindal私は答えを更新しました。 – destoryer

+0

ありがとう..よく働いています:) –

1

あなたが参照を保持してフラットな配列を作るとCommentCreateStampことによってそれを並べ替えることができます:ここで は、再帰的にsortingを呼び出すスニペットです。

少し@changed答えの絞り込み

function getFlat(o) { 
 
    this.push(o); 
 
    Array.isArray(o.Comments) && o.Comments.forEach(getFlat.bind(this)); 
 
} 
 

 
var object = { "CommentText": "", "CommentCreateStamp": "2016-03-22", "Comments": [{ "CommentText": "comment 1", "CommentCreateStamp": "2016-03-18", "Comments": [{ "CommentText": "comment 1-1", "CommentCreateStamp": "2016-03-15", "Comments": [{ "CommentText": "comment 1-1-1", "CommentCreateStamp": "2016-03-21", "Comments": null }] }] }] }, 
 
    flat = []; 
 

 
getFlat.bind(flat)(object); 
 
flat.sort(function (a, b) { 
 
    return a.CommentCreateStamp.localeCompare(b.CommentCreateStamp); 
 
}); 
 
document.write('<pre>' + JSON.stringify(flat, 0, 4) + '</pre>');

+0

答えをありがとうが、私は同じ形式でフラットな配列ではないオブジェクトをソートしたい。 –

0

- 私は、次はかなりうまく動作することを見つける:

export function sortObj(jsObj, sortKey,flgReverse) { 
    sortKey = sortKey.split("."); 
    let sk = ''; 
    Object.keys(sortKey).forEach(function(key,idx){ 
    sk += '[\'' + sortKey[key] + '\']'; 
    }); 
    function sortByKey(a, b) { 
     var x = eval("a" + sk); 
     var y = eval("b" + sk); 
     if(flgReverse) return ((x < y) ? -1 : ((x > y) ? 1 : 0)); 
     else return ((x < y) ? 1 : ((x > y) ? -1 : 0)); 
    }; 
    return jsObj.sort(sortByKey); 
    }; 
関連する問題