2017-11-09 8 views
1

複雑なグループ関数を書くのは良くありません。誰も私をここで助けてくれることを願っています。私は解決策を探していましたが、私の問題を解決できるものは何も見つかりませんでした。グループ値は{n}(長さ小)から次の項目への配列

私が欲しいのは、「長さプロパティ」の最大範囲(配列内のオブジェクトを参照)で項目を次の配列項目にグループ化する「関数をグループ化する」(以下を参照)に配列のリストを渡すことです。

私が達成したいことを説明できることを願っています。

// input 
let list = [ 
    {start: 5, length: 1}, 
    {start: 8, length: 1}, 
    {start: 9, length: 1}, 
    {start: 10, length: 1}, 
    {start: 11, length: 1}, 
    {start: 12, length: 1}, 
    {start: 20, length: 1}, 
    {start: 24, length: 1}, 
    {start: 25, length: 1}, 
    {start: 37, length: 2}, 
    {start: 39, length: 1}, 
    {start: 40, length: 1}, 
]; 

// group function like 
groupedList = groupBy(list, (prevItem, nextItem) => { 
    return (nextItem.start - prevItem.start) === prevItem.length; 
}); 

// output 
let groupedList = [ 
    [ 
    {start: 5, length:1}, 
    ], 
    [ 
    {start: 8, length:1}, 
    {start: 9, length:1}, 
    {start: 10, length:1}, 
    {start: 11, length:1}, 
    {start: 12, length:1}, 
    ], 
    [ 
    {start: 20, length:1}, 
    ], 
    [ 
    {start: 24, length:1}, 
    {start: 25, length:1}, 
    ], 
    [ 
    {start: 37, length:2}, 
    {start: 39, length:1}, 
    {start: 40, length:1}, 
    ], 
]; 
+0

理由を1つのグループに '37'と' 39'のですか? –

+0

37は長さprop値が2!次の項目は39 – Bitcollage

+0

にする必要があります。また、達成したいことについてさらに詳しく説明してください。私にはまだ不明です。 – Corcus

答えて

0

あなたが実際startに前任者とグループ、それをチェックすることができますが前身startlengthの和の等しいです。

var list = [{ start: 5, length: 1 }, { start: 8, length: 1 }, { start: 9, length: 1 }, { start: 10, length: 1 }, { start: 11, length: 1 }, { start: 12, length: 1 }, { start: 20, length: 1 }, { start: 24, length: 1 }, { start: 25, length: 1 }, { start: 37, length: 2 }, { start: 39, length: 1 }, { start: 40, length: 1 }], 
 
    result = list.reduce(function (r, a, i, aa) { 
 
     if (!i || aa[i - 1].start + aa[i - 1].length !== a.start) { 
 
      r.push([a]); 
 
     } else { 
 
      r[r.length - 1].push(a); 
 
     } 
 
     return r; 
 
    }, []); 
 

 

 

 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

ありがとうございました:) – Bitcollage

0

私はあなたの質問を理解しています。私の考えは、オブジェクトを作成し、すべての結果をこのオブジェクトにプッシュすることです。このような何か:

var groups = Object.create(null); 

for (var i = 0; i < results.length; i++) { 
    var item = result[i]; 

    if(!groups[item.start]) groups[item.start] = []; 

    groups[item.results].push({ 
     Start: item.start, 
     Length: item.length 
    }); 
} 

var result = []; 

for (var x in groups) { 
    var obj = {}; 
    obj[x] = groups[x]; 
    result.push(obj); 
} 
関連する問題