2016-07-26 11 views
-4

私はこのような配列を持っており、連続した状態が同じ場合はオブジェクトをマージしたい。配列内のオブジェクトをマージする

InputArray

[ {"state" : "A", "st" : 12, "et" : 14 }, 
    {"state" : "A", "st" : 14, "et" : 16 }, 
    {"state" : "B", "st" : 20, "et" : 94 }, 
    {"state" : "B", "st" : 94, "et" : 104 } 
] 

の予想される出力(ここではstが最初のオブジェクトの連続したオブジェクトになりますとetが最後の連続したオブジェクトになります):

[ {"state" : "A", "st" : 12, "et" : 16 }, 
    {"state" : "B", "st" : 20, "et" : 104 } 
] 
+0

彼らは常にconsecutivesていますか?何か試しましたか? – Simon

+0

連続しているかもしれないし、そうでないかもしれない – Raju

+0

あなたはこれをPythonで行う必要がありますか? –

答えて

0

私はよく分かりません。あなたはjavascriptの上これを達成しようとした場合でも、ちょうど状態で、その後、必要なフィールドを持つオブジェクトに各グループを回すこのJsfiddle here

function remove_duplicates(objectsArray) { 
    var usedObjects = []; 

    for (var i=objectsArray.length - 1;i>=0;i--) { 
     var newRecord = true; 
     for (var j=usedObjects.length - 1;j>=0;j--) { 
      if (usedObjects[j].state == objectsArray[i].state) { 
        newRecord = false; 
       break; 
      }   
     } 
     if (newRecord) { 
      usedObjects.push(objectsArray[i]); 
     } 
    } 

    return usedObjects; 

} 

var objectsArray = [{"state" : "A", "st" : 12, "et" : 14 }, 
    {"state" : "A", "st" : 14, "et" : 16 }, 
    {"state" : "B", "st" : 20, "et" : 94 }, 
    {"state" : "B", "st" : 94, "et" : 104 }]; 
var clean = remove_duplicates(objectsArray); 

console.log(clean); 
0

グループを試してみてください。

function merge(input) { 
    const groups = groupBy(input, function(elt) { return elt.state; }); 

    const states = Object.keys(groups); 
    const result = []; 

    for (i = 0; i < states.length; i++) { 
    const group = groups[state]; 
    result.push({ 
     state: group[0].state, 
     st: group[0].st, 
     et: group[group.length - 1].et 
    }); 
    } 

    return result; 
} 

はとして残されgroupByを書きます運動。または、アンダースコアの_.groupByを使用することもできます。配列と、グループ化の基準を指定する関数と、キーがグループ名であり、値がそのグループに属するすべての要素の配列であるオブジェクトを返します。

上記のコードは、groupsオブジェクトの各プロパティをループし、それぞれの結果の配列にグループの最初のメンバーからstと最後のものからetを取る1つのオブジェクトをプッシュします。

あなたはアンダースコアを使用している場合は、オブジェクト上でその_.mapを使用して物事を単純化することができます:

function merge(input) { 
    return _.map(_.groupBy(input, 'state'), (key, items) => ({ 
    state: key, 
    st: items[0].st, 
    et: items[items.length - 1].et 
    })); 
} 
0

は、あなたが場所で次のように行うことができますすることができ、

var arr = [ {"state" : "A", "st" : 12, "et" : 14 }, 
 
      {"state" : "A", "st" : 14, "et" : 16 }, 
 
      {"state" : "B", "st" : 20, "et" : 94 }, 
 
      {"state" : "B", "st" : 94, "et" : 104 }, 
 
      {"state" : "C", "st" : 37, "et" : 42 } 
 
      ], 
 
reduced = arr.reduceRight((p,c,i,a) => { p.state == c.state ? (p.st = c.st, a.splice(i,1)) 
 
                  : p = c; 
 
             return p; 
 
             }); 
 
console.log(arr);

関連する問題