He recibido una respuesta JSON como

            [
             {"no":001, "location": "England", "year":"2017", "month":"4", "amount":"1000"},
             {"no":002, "location": "Italy", "year":"2017", "month":"3", "amount":"8000"},
             {"no":001, "location": "England", "year":"2016", "month":"2", "amount":"9000"},
             {"no":001, "location": "England", "year":"2016", "month":"11","amount":"12000"}
            ];

Necesito hacerlo

            [
             {"no":001, "location": "England", "year":"2016", "amount2":"9000", "amount11":"12000"},
             {"no":001, "location": "England", "year":"2017", "amount4":"1000"},
             {"no":002, "location": "Italy", "year":"2017", "amount3":"8000"}
            ];

Eso se basa en la no conversión de múltiples registros a uno con cantidades específicas de meses e información común, es decir, ubicación, pero el mismo no debe tener registros diferentes correspondientes al año.

-4
javalearner_heaven 14 ene. 2017 a las 04:19

4 respuestas

La mejor respuesta

Aquí se actualiza el código es5 para que coincida con la última edición de la pregunta: (Todavía no estoy seguro de entender lo que quieres de no, así que por ahora lo dejo como number, que está en la entrada (no entre comillas)

var input = [
{"no":001, "location": "England", "year":"2017", "month":"4", "amount":"1000"},
{"no":002, "location": "Italy", "year":"2017", "month":"3", "amount":"8000"},
{"no":001, "location": "England", "year":"2016", "month":"2", "amount":"9000"},
{"no":001, "location": "England", "year":"2016", "month":"11","amount":"12000"}
];

/*
[
{"no":001, "location": "England", "year":"2016", "amount2":"9000", "amount11":"12000"},
{"no":001, "location": "England", "year":"2017", "amount4":"1000"},
{"no":002, "location": "Italy", "year":"2017", "amount3":"8000"}
];
*/

var output = input.reduce( function(result, cur) {
  var ref = result.find( function(row) {
  	return row.no === cur.no && row.location === cur.location && cur.year === row.year }
  );
  if (ref) {
  	ref["amount"+cur.month] = cur.amount;
  } else {
  	var newRow = { "no": cur.no, "location": cur.location, "year": cur.year };
    newRow["amount"+cur.month] = cur.amount;
    result.push(newRow);
  }
  return result;
},[])

console.log(output);
1
Mirko Vukušić 14 ene. 2017 a las 12:24

Consejo general: recopile la información por ID en otra estructura de datos. Supongo que este es un Patrón de acumulador.

var rows = [
    {"no":"001","month":"4","amount":"1000"},
    {"no":"002","month":"3","amount":"8000"},
    {"no":"001","month":"2","amount":"9000"},
    {"no":"001","month":"11","amount":"12000"}
];
var results = [];

var idToResultsObject = {};

for (var i = 0; i < rows.length; i++) {
    var row = rows[i];
    var id = row['no'];
    if (typeof idToResultsObject[id] == 'undefined')
        idToResultsObject[id] = { 'no' : id };
    idToResultsObject[id]['location'] = row['location'];
    idToResultsObject[id]['amount' + row['month']] = row['amount'];
}

for (var id in idToResultsObject) {
    results.push(idToResultsObject[id]);
}

console.log(results);

Seguramente hay una mejor manera de almacenar esto.

2
javalearner_heaven 14 ene. 2017 a las 03:22

Sintaxis es5

var input = [
    {"no":001,"month":"4","amount":"1000"},
    {"no":002,"month":"3","amount":"8000"},
    {"no":001,"month":"2","amount":"9000"},
    {"no":001,"month":"11","amount":"12000"}
];

/*
[
    {"no":001, "amount2":"9000", "amount4":"1000", "amount11":"12000"},
    {"no":002, "amount3":"8000"}
];
*/

var output = input.reduce( function(result, cur) {
  var ref = result.find( function(row) { return row.no === cur.no });
  if (ref) {
  	ref["amount"+cur.month] = cur.amount;
  } else {
  	var newRow = { "no": cur.no };
    newRow["amount"+cur.month] = cur.amount;
    result.push(newRow);
  }
  return result;
},[])

console.log(output);
0
Mirko Vukušić 14 ene. 2017 a las 11:08

Como otros han sugerido, es realmente una mala forma de diseñar esos objetos. Pero este código hace lo que quieres (sintaxis es6):

var input = [
    {"no":001,"month":"4","amount":"1000"},
    {"no":002,"month":"3","amount":"8000"},
    {"no":001,"month":"2","amount":"9000"},
    {"no":001,"month":"11","amount":"12000"}
];

/*
[
    {"no":001, "amount2":"9000", "amount4":"1000", "amount11":"12000"},
    {"no":002, "amount3":"8000"}
];
*/

var output = input.reduce( (result, cur) => {
  var ref = result.find( row => row.no === cur.no);
  if (ref) {
  	ref["amount"+cur.month] = cur.amount;
  } else {
  	var newRow = { "no": cur.no };
    newRow["amount"+cur.month] = cur.amount;
    result.push(newRow);
  }
  return result;
},[])

console.log(output);
0
Mirko Vukušić 14 ene. 2017 a las 02:16