Estoy tratando de encontrar una solución elegante para fusionar los valores de las propiedades del objeto si el nombre es el mismo.

Ejemplo:

var object = {
"10-10-2017": "Black friday",
"11-09-2017": "Some holiday",
"10-10-2017": "Fathers day"
}

Combinar para:

var object = {
"10-10-2017": "Black friday Fathers day",
"11-09-2017": "Some holiday",
}

Utilizo este objeto como fuente para el calendario donde el nombre de la propiedad es la fecha y el valor de la propiedad es / son eventos para la fecha y mi solución no puede manejar dos propiedades con el mismo nombre. Este feed es generado por el motor de plantillas y no puede hacerlo solo de esta manera (para cada contexto de un evento agrega una línea al objeto) cuando se representa una vista.

Para aquellos que conocen Kentico CMS, estoy usando repetidor con efecto para construir este objeto, donde "var object = {" es html envolvente antes y "}" es html envolvente después.

1
Luk Deathrage Prochzka 28 oct. 2017 a las 13:58

3 respuestas

La mejor respuesta

Para la primera edición, sugiero que cambie su objeto a otra forma de

var object = {
"10-10-2017": "Black friday",
"11-09-2017": "Some holiday",
"10-10-2017": "Fathers day"
}

Para

var object =[
{"date":"10-10-2017","value":"Black friday"},
{"date":"11-09-2017","value":"Some holiday"},
{"date":"10-10-2017","value":"Fathers day"}
]

Si eso te ayuda, aquí está la solución de trabajo

var object = [{date:"10-10-2017",value:"Black friday"},{date:"11-09-2017",value:"Some holiday"},{date:"10-10-2017",value:"Fathers day"}];

var output =[];

object.forEach(function(value) {
  var existing = output.filter(function(v, i) {
    return v.date == value.date;
  });
  if (existing.length) {
    var existingIndex = output.indexOf(existing[0]);
    output[existingIndex].value += ' '+value.value
    
  } else {
    if (typeof value.value == 'string')
      value.value = value.value;
    output.push(value);
  }
});

console.log(JSON.stringify(output)); //returns [{"date":"10-10-2017","value":"Black friday Fathers day"},{"date":"11-09-2017","value":"Some holiday"}]
0
Neji Soltani 28 oct. 2017 a las 14:57

En primer lugar, su código no es correcto, ya que JS solo recogerá el último accesorio si el nombre es el mismo.

> var object = {
... "10-10-2017": "Black friday",
... "11-09-2017": "Some holiday",
... "10-10-2017": "Fathers day"
... }
undefined
> object
{ '10-10-2017': 'Fathers day', '11-09-2017': 'Some holiday' }
>

Pero

Para el accesorio adicional, hay una solución, espero que esto te ayude, p. tu

object[newProperty] = (object[newProperty] || '') + newValue;
-3
Xin 28 oct. 2017 a las 11:04

En caso de que la pregunta de mi comentario responda con , esto posiblemente proporciona un enfoque de trabajo ...

// BEGIN of CMS templating ...

var descriptorList = [];

// programmatically push into a list of property descriptors,
// each descriptor holding just one key value pair.


  // +++ BEGIN iteration here ...

    descriptorList.push({ "10-10-2017": "Black friday" });
    // ...
    // ... keep looping ... "Kentico CMS repeater"?


    // for the sake of providing a working example
    // there will be some more descriptors pushed ...

    descriptorList.push({ "11-09-2017": "Some holiday" });
    descriptorList.push({ "10-10-2017": "Fathers day" });

  // ... END of iteration. +++


function mergeObjectsAndConcatSamePropertyStringTypes(a, b) {
  var
    type = Object.assign({}, a, b);       // - start with a raw merged type (merger).

  Object.keys(b).filter(function (key) {  // - collect `key` duplicates. 
    return (key in a);
  }).forEach(function (key) {             // - for each duplicate `key` that targets
    var aValue = a[key];                  //   a string type at each object, do concat
    var bValue = b[key];                  //   this values and assign it to the merger.
    if ((typeof aValue == 'string') &&/*||*/ (typeof bValue == 'string')) {
      type[key] = [aValue, bValue].join(' ');
    }
  });

  return type;
}

// assembling of the desired type ...
var type = descriptorList.reduce(mergeObjectsAndConcatSamePropertyStringTypes, {});

// END of CMS templating ...


console.log('descriptorList : ', descriptorList);
console.log('type : ', type);
.as-console-wrapper { max-height: 100%!important; top: 0; }
0
Peter Seliger 28 oct. 2017 a las 15:18