2016-07-26 3 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

Group государством, а затем превратить каждую группу в объект с нужными полями:

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 Underscore. Он принимает массив и функцию, определяющую критерии группировки, и возвращает объект, ключи которого являются именем группы и значениями, представляют собой массив всех элементов, входящих в эту группу.

Затем код, который затем обрабатывает каждое свойство в объекте групп, и для каждого из них выталкивает в массив результатов один объект, принимающий st от первого члена группы и et от последнего.

Если вы используете подчеркивания, можно упростить, используя его _.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);