2016-07-26 81 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留作行使。或者,您可以使用Underscore的_.groupBy。它接受一個數組和一個指定分組標準的函數,並返回一個對象,其鍵是組名,值是落入該組的所有元素的數組。

上面的代碼,然後通過每個屬性循環在對象組,並且對於每個,推到結果的一個陣列中的單個對象服用從組的第一個成員的stet從最後。

如果使用下劃線,你可以通過使用對象的_.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);