2017-03-31 24 views
0

私はJSで再フォーマットしたい既存の配列を持っています。ここでは、各項目がオブジェクトである既存のアレイされています既存の配列からオブジェクトの新しい配列を作成する

[ 
{ 
    end_time:"7.14", 
    pk:45065, 
    start_time:"4.51", 
    text:"Lorem Ipsum" 
}, 
{ 
    end_time:"9.00", 
    pk:45066, 
    start_time:"7.14", 
    text:"Lorem Ipsum Something" 
}, 
{ 
    end_time:"13.09", 
    pk:450667 ,  
    start_time:"9.00", 
    text:"Lorem Ipsum Something" 
}, 
{ 
    end_time:"17.01", 
    pk:45068, 
    start_time:"13.09", 
    text:"Lorem Ipsum" 
}, 
{ 
    end_time:"25.10", 
    pk:45069, 
    start_time:"17.01", 
    text:"Lorem Ipsum Something" 
}, 
{ 
    end_time:"28.06", 
    pk:450670 ,  
    start_time:"25.10", 
    text:"Lorem Ipsum Something" 
}, 
] 

私は古い配列内のすべての3つのオブジェクトのためのオブジェクトの新しい配列を作成したいと思いますのでような新しい配列に一つのオブジェクトになり:

[ 
    segment: { 
    phrase: { 
     end_time:"7.14", 
     pk:45065, 
     start_time:"4.51", 
     text:"Lorem Ipsum" 
    }, 
    phrase: { 
     end_time:"9.00", 
     pk:45066, 
     start_time:"7.14", 
     text:"Lorem Ipsum Something" 
    }, 
    phrase: { 
     end_time:"13.09", 
     pk:450667 ,  
     start_time:"9.00", 
     text:"Lorem Ipsum Something" 
    } 
    }, 
    segment { 
    phrase: { 
     end_time:"17.01", 
     pk:45068, 
     start_time:"13.09", 
     text:"Lorem Ipsum" 
    }, 
    phrase: { 
     end_time:"25.10", 
     pk:45069, 
     start_time:"17.01", 
     text:"Lorem Ipsum Something" 
    }, 
    phrase: { 
     end_time:"28.06", 
     pk:450670 ,  
     start_time:"25.10", 
     text:"Lorem Ipsum Something" 
    }, 
    } 
] 

私が最も苦労しているのは、3つのアイテムをすべて抜き出し、地図やループ内の新しいセグメントオブジェクトにプッシュする方法です。私はこれについて最も効率的に行く方法がわからない。どんな助けでも大歓迎です。

+0

エッジケース 'arr.length%3 == 0 ' –

+1

相、相、相...同じキーで何が起こりますか!? –

+5

多くのオブジェクトプロパティに同じキーを使用することはできません。したがって、これは機能しません。 –

答えて

0

機能を減らしはkey語句であり、その値は、その指定されたオブジェクトであり、新しいオブジェクト、内部json配列からすべてのオブジェクトをドロップ。次に、セグメントキーの値として新しく作成されたオブジェクトに結果を割り当てます。

var json = [{end_time:"7.14",pk:45065,start_time:"4.51",text:"Lorem Ipsum"},{end_time:"9.00",pk:45066,start_time:"7.14",text:"Lorem Ipsum Something"},{end_time:"13.09",pk:450667,start_time:"9.00",text:"Lorem Ipsum Something"},{end_time:"17.01",pk:45068,start_time:"13.09",text:"Lorem Ipsum"},{end_time:"25.10",pk:45069,start_time:"17.01",text:"Lorem Ipsum Something"},{end_time:"28.06",pk:450670,start_time:"25.10",text:"Lorem Ipsum Something"}], 
 
    res = json.reduce(function(s,a){ 
 
    obj = {}; 
 
    obj.phrase = a; 
 
    s.push(obj); 
 
    return s; 
 
    }, []); 
 
    
 
    var object = {}; 
 
    object.segment = res; 
 
    var result = [object]; 
 
    
 
    console.log(result);

+0

あなたのコードが何をしているのか、それがどのように問題を解決するのかを説明するのはとても親切でしょうか? –

0
  1. 配列が何の文字列キーを持っていないとして、あなたの希望の結果がオブジェクトでなければなりません。
  2. オブジェクトには一意のキーが必要です。そのため、提案されたソリューションでは、「セグメント」と「フレーズ」キーに番号の接尾辞が追加されます。
  3. コード:

var arr = [ 
 
    { 
 
    end_time:"7.14", 
 
    pk:45065, 
 
    start_time:"4.51", 
 
    text:"Lorem Ipsum" 
 
    }, 
 
    { 
 
    end_time:"9.00", 
 
    pk:45066, 
 
    start_time:"7.14", 
 
    text:"Lorem Ipsum Something" 
 
    }, 
 
    { 
 
    end_time:"13.09", 
 
    pk:450667 ,  
 
    start_time:"9.00", 
 
    text:"Lorem Ipsum Something" 
 
    }, 
 
    { 
 
    end_time:"17.01", 
 
    pk:45068, 
 
    start_time:"13.09", 
 
    text:"Lorem Ipsum" 
 
    }, 
 
    { 
 
    end_time:"25.10", 
 
    pk:45069, 
 
    start_time:"17.01", 
 
    text:"Lorem Ipsum Something" 
 
    }, 
 
    { 
 
    end_time:"28.06", 
 
    pk:450670 ,  
 
    start_time:"25.10", 
 
    text:"Lorem Ipsum Something" 
 
    }, 
 
]; 
 
var obj = {}; 
 
arr.forEach(arrayTransformClosure(obj)); 
 
document.getElementById('output').innerHTML = JSON.stringify(obj, null, 2); 
 
// Functions 
 
function arrayTransformClosure(obj) { 
 
    var phrase = 0; 
 
    var segment = 1; 
 
    return function (elem) { 
 
    ++phrase; 
 
    if (phrase == 1) { 
 
     obj['segment_' + segment] = { 
 
     ['phrase_' + phrase]: elem 
 
     }; 
 
    } else if (phrase <= 3) { 
 
     obj['segment_' + segment]['phrase_' + phrase] = elem; 
 
    } else { 
 
     phrase = 1; 
 
     ++segment; 
 
     obj['segment_' + segment] = { 
 
     ['phrase_' + phrase]: elem 
 
     }; 
 
    } 
 
    }; 
 
}
<pre id="output"></pre>

関連する問題