underscore react pick debounce javascript json underscore.js

javascript - react - Cómo usar underscore.js para producir un resultado plano



underscore lodash (4)

El objeto json es

var data = [{"Parent":1,"Child":[4,5,6]},{"Parent":2},{"Parent":3}]

¿Cómo puedo usar la función underscore.js chain / map / pluck etc ... para obtener el resultado aplanado?

var result = []; for (var i = 0; i < data.length; i++) { result.push(data[i].Parent); if (data.Child != undefined) { for (var j = 0; j < data[i].Child.length; j++) { result.push(data[i].Child[j]); } } } console.log(result) >> //1,4,5,6,2,3


Alternativamente, si desea una función que pueda aplanar universalmente cualquier colección de objetos o matrices,

Usted podría extender el guión bajo:

_.mixin({crush: function(l, s, r) {return _.isObject(l)? (r = function(l) {return _.isObject(l)? _.flatten(_.map(l, s? _.identity:r)):l;})(l):[];}});

Crush (por falta de un nombre mejor) se puede llamar como _.crush(list, [shallow]) o _(list).crush([shallow]) y se comporta exactamente como una forma generalizada de Flatten incorporado en Underscore.

Se puede pasar una colección de objetos anidados, matrices, o ambos de cualquier profundidad y devolverá una matriz de un solo nivel que contiene todos los valores de entrada y propiedades propias. Al igual que Flatten , si se pasa un argumento adicional que se evalúa como verdadero, se realiza una ejecución "superficial" con la salida solo aplanada un nivel.

Ejemplo 1:

_.crush({ a: 1, b: [2], c: [3, { d: { e: 4 } }] }); //=> [1, 2, 3, 4]

Ejemplo 2:

_.crush({ a: 1, b: [2], c: [3, { d: { e: 4 } }] }, true); //=> [1, 2, 3, { // d: { // e: 4 // } // }]

Una explicación del código en sí es la siguiente:

_.mixin({ // This extends Underscore''s native object. crush: function(list, shallow, r) { // The "r" is really just a fancy // way of declaring an extra variable // within the function without // taking up another line. return _.isObject(list)? // Arrays (being a type of object) // actually pass this test too. (r = function(list) { // It doesn''t matter that "r" might have // been passed as an argument before, // as it gets rewritten here anyway. return _.isObject(list)? // While this test may seem redundant at // first, because it is enclosed in "r", // it will be useful for recursion later. _.flatten(_.map(list, shallow? // Underscore''s .map is different // from plain Javascript''s in // _.map will always return // that it will apply the passed // an array, which is why we // function to an object''s values // can then use _.flatten. // as well as those of an array. _.identity // If "shallow" is truthy, .map uses the identity // function so "list" isn''t altered any further. : r // Otherwise, the function calls itself on each value. )) : list // The input is returned unchanged if it has no children. ; })(list) // The function is both defined as "r" and executed at once. : [] // An empty array is returned if the initial input ; // was something other than an object or array. } });

Espero que ayude si alguien lo necesita. :)


Aquí hay una solución más corta:

flat = _.flatten(_.map(data, _.values))


Si desea usar underScore.js para aplanar una matriz de muchas matrices en una matriz de elementos, así es como lo hace. Sigue mi ejemplo:

Mi gráfica tiene 2 series. Cada serie tiene un nombre y una secuencia de puntos de datos {xtime, yValue}. Mi objetivo es eliminar todos los puntos de datos de 2 series en una serie de puntos de datos para completar una tabla.

var reducedArray = // flatten an array of series of data-objects into one series of data-objects _.flatten( _.map( AllMySeries, function ( aSeries ) { return ( _.map( aSeries.dataPoints, function ( aPoint ) { return { curveID: aSeries.legendText, xT: aPoint.x, yVal: aPoint.y }; } ) ); } ) );

Mi resultado:

''Series1'',''2017-04-19 08:54:19'',1 ''Series1'',''2017-04-19 08:59:19'',0 ''Series1'',''2017-04-19 09:04:19'',1 ''Series2'',''2017-04-19 08:54:19'',1 ''Series2'',''2017-04-19 08:59:19'',0 ''Series2'',''2017-04-19 09:04:19'',1


Suponiendo que primero quiere obtener a los padres y luego a los niños:

_.chain(data).pluck("Parent") .concat(_.flatten(_(data).pluck("Child"))) .reject(_.isUndefined) .value()