Tengo un ejemplo de JavaScript donde tengo una matriz articleBody donde estoy tratando de ordenar los valores de la clave "tipo" Tengo la función de ordenar lista como se muestra:

Matriz:

var articleBody = [
    {
        "type": "code"  
    },{
        "type": "video"  
    },{
        "type": "code"  
    },{
        "type": "video"  
    },{
        "type": "code"  
    },{
        "type": "video"  
    }
]

La función de clasificación:

articleBody.sort(function(a, b) {
    var typeA = a.type.toUpperCase(); 
    var typeB = b.type.toUpperCase(); 
    if (typeA < typeB) {
        return -1;
    }
    if (typeA > typeB) {
        return 1;
    }
    return 0;
});

¿Cómo obtengo una submatriz con el tipo A y una para el tipo B?

-1
MikeL5799 7 sep. 2018 a las 17:06

4 respuestas

La mejor respuesta

Si simplemente está tratando de obtener una matriz filtrada por tipo, entonces una función simple como la siguiente funcionaría:

/**
 * @param {Array} arr - the array being filtered
 * @param {String} type - value of the type being sought
 * @returns array filtered by type
 */
function subArrayByType(arr, type) {
    return arr.filter(el=>el.type == type);
}

const codes = subArrayByType(articleBody, 'code');
const videos = subArrayByType(articleBody, 'video');
2
wlh 7 sep. 2018 a las 14:15

Podría adoptar un enfoque de bucle único y un objeto y tomar el tipo como criterio para empujar.

var articleBody = [{ type: "code" }, { type: "video" }, { type: "code" }, { type: "video" }, { type: "code" }, { type: "video" }],
    types = {};

articleBody.forEach(o => (types[o.type] = types[o.type] || []).push(o));

console.log(types);
.as-console-wrapper { max-height: 100% !important; top: 0; }
1
Nina Scholz 7 sep. 2018 a las 14:16

El filter devuelve el método una copia de su matriz con todos los elementos, que coinciden con un determinado predicado.

const typeA = articleBody.filter(a => a.type === 'code');
const typeB = articleBody.filter(a => a.type === 'video');
1
slartidan 7 sep. 2018 a las 14:45
function splitByPropVal(array, prop) {
    return array.reduce(function(acc, item) {
      if (acc[item[prop]] === undefined) acc[item[prop]] = [];
      acc[item[prop]].push(item);
      return acc;
    }, {});
  }

splitByPropVal(articleBody, 'type');
2
danielgormly 7 sep. 2018 a las 14:16