2016-10-03 5 views
1

У меня есть объект, как:Flatten Javascript массив объектов

[ 
    { 
    "DATA": "2016-01-22", 
    "TOTAL": "7" 
    }, 
    { 
    "DATA": "2016-01-25", 
    "TOTAL": "3" 
    }, 
    { 
    "DATA": "2016-01-26", 
    "TOTAL": "1" 
    }, 
    { 
    "DATA": "2016-01-27", 
    "TOTAL": "2" 
    }, 
    { 
    "DATA": "2016-01-22", 
    "TOTAL": "1" 
    }, 
    { 
    "DATA": "2016-01-25", 
    "TOTAL": "1" 
    }, 
    { 
    "DATA": "2016-01-27", 
    "TOTAL": "1" 
    }, 
... 
] 

Как я могу сжать его вниз к чему-то, как показано ниже, это, сцепить/присоединиться к TOTAL ключи где дата одинакова и заправить 0 в случае, если дата не повторяется ?:

[ 
    { 
    "DATA": "2016-01-22", 
    "TOTAL": ["7", "1"] 
    }, 
    { 
    "DATA": "2016-01-25", 
    "TOTAL": ["3", "1"] 
    }, 
    { 
    "DATA": "2016-01-26", 
    "TOTAL": ["1", "0"] 
    }, 
    { 
    "DATA": "2016-01-27", 
    "TOTAL": ["2", "1"] 
    } 
] 

Я пытался с этим блоком кода, но не может получить итог ключей все же размерность - заполненные нули будет хорошо.

var output = []; 
d.forEach(function(value) { 
    var existing = output.filter(function(v, i) { 
     return v.DATA == value.DATA; 
    }); 
    if (existing.length) { 
     var existingIndex = output.indexOf(existing[0]); 
     output[existingIndex].TOTAL = output[existingIndex].TOTAL.concat(value.TOTAL); 
    } else { 
     if (typeof value.TOTAL == 'string') 
      value.TOTAL = [value.TOTAL]; 
     output.push(value); 
    } 
}); 
console.log(JSON.stringify(output, null, 4)); 
+0

'output' появляется вернуть ожидаемый результат, за исключением объекта с индексом' 2' содержит массив с '.length'' 1'? – guest271314

ответ

1
var someData = [] // <- your instantiated array in question. 
var transformedData = []; 

var highestCount = 0; 

someData.forEach(x => { 
    var foundIndex = transformedData.findIndex((ele) => ele.DATA === x.DATA); 
    if (foundIndex < 0) { 
     transformedData 
      .push({DATA : x.DATA, TOTAL : [x.TOTAL]}); 
    } else { 
     transformedData[foundIndex] 
      .TOTAL.push(x.TOTAL); 
     var currentCountAtIndex = transformedData[foundIndex].TOTAL.length; 
     if (highestCount < transformedData[foundIndex].TOTAL.length) highestCount = currentCountAtIndex; 
    } 
}); 

// fill any indicies in array that are lower than the highest count with 0 
transformedData 
    .forEach(x => { 
     if (x.TOTAL.length < highestCount) { 
      while(x.TOTAL.length < highestCount) { 
       x.TOTAL.push(0); 
      } 
     } 
    }); 
+0

Вот и все! Очень приятно :) – mjpramos

0

Это может быть так просто, как это:

var result = {}; 
 
var test = [ 
 
    { 
 
    "DATA": "2016-01-22", 
 
    "TOTAL": "7" 
 
    }, 
 
    { 
 
    "DATA": "2016-01-25", 
 
    "TOTAL": "3" 
 
    }, 
 
    { 
 
    "DATA": "2016-01-26", 
 
    "TOTAL": "1" 
 
    }, 
 
    { 
 
    "DATA": "2016-01-27", 
 
    "TOTAL": "2" 
 
    }, 
 
    { 
 
    "DATA": "2016-01-22", 
 
    "TOTAL": "1" 
 
    }, 
 
    { 
 
    "DATA": "2016-01-25", 
 
    "TOTAL": "1" 
 
    }, 
 
    { 
 
    "DATA": "2016-01-27", 
 
    "TOTAL": "1" 
 
    }]; 
 

 
console.log("test array: ", test); 
 

 
var len = 0, 
 
sorted; 
 

 
// Flatten the object. 
 
test.forEach(d => { 
 
    result[d.DATA] == undefined ? result[d.DATA] = [d.TOTAL] : result[d.DATA].push(d.TOTAL); 
 
}); 
 

 
// Sort so we get the max length to know how many zeros to add. 
 
sorted = Object.keys(result).sort((k, b) => { 
 
    return result[k].length - result[b].length; 
 
}); 
 

 
// Max length from the sorted array. 
 
len = result[sorted[sorted.length - 1]].length; 
 

 
// push zeros 
 
Object.keys(result).forEach(k => { 
 
    if(result[k].length < len){ 
 
    for(var i = result[k].length; i < len; i++){ 
 
    result[k].push("0"); 
 
    } 
 
    } 
 
}); 
 

 
console.log("result: ", result);

+1

Хороший ответ. Если это сработает, я пойду с этим. Единственное, что вы меняете ключи «DATA» на свои значения, что может быть не то, что требуется OP (по крайней мере, это не то, что у нас есть на примере вопроса) – rafaelbiten

+0

Спасибо, это по-прежнему действительно «тот же» объект , Просто нужно изменить ключ, с которым вы обращаетесь к значениям. Я добавляю нули сейчас. – inoabrian