2016-07-26 80 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);