Un usuario preguntó 👇

[ad_1]

Hay un buen método de matriz reduce() para obtener un valor de la matriz. Ejemplo:

[0,1,2,3,4].reduce(function(previousValue, currentValue, index, array)
  return previousValue + currentValue;
);

¿Cuál es la mejor manera de lograr lo mismo con los objetos? Me gustaría hacer esto:

 
    a: value:1, 
    b: value:2, 
    c: value:3 
.reduce(function(previous, current, index, array)
  return previous.value + current.value;
);

Sin embargo, Object no parece tener ninguna reduce() método implementado.

Posible respuesta

Una opción sería reduce los keys():

var o =  
    a: value:1, 
    b: value:2, 
    c: value:3 
;

Object.keys(o).reduce(function (previous, key) 
    return previous + o[key].value;
, 0);

Con esto querrá especificar un valor inicial o la primera ronda será 'a' + 2.

Si quieres el resultado como un Objeto ( value: ... ), tendrá que inicializar y devolver el objeto cada vez:

Object.keys(o).reduce(function (previous, key) 
    previous.value += o[key].value;
    return previous;
,  value: 0 );

Posible respuesta

Lo que realmente quieres en este caso son los Object.values. aquí hay un resumen ES6 implementación con esto en mente:

const add = 
  a: value:1,
  b: value:2,
  c: value:3


const total = Object.values(add).reduce((t, value) => t + value, 0)

console.log(total) // 6

o simplemente:

const add = 
  a: 1,
  b: 2,
  c: 3


const total = Object.values(add).reduce((t, n) => t + n)

console.log(total) // 6

Implementación de ES6: Objeto.entradas()

const o = 
  a: value: 1,
  b: value: 2,
  c: value: 3
;

const total = Object.entries(o).reduce(function (total, pair) 
  const [key, value] = pair;
  return total + value.value;
, 0);

Posible respuesta

En primer lugar, no entiendes bien lo que es. reducirel valor anterior de es.

En tu pseudocódigo tienes return previous.value + current.valuePor lo tanto, los previous el valor será un número en la próxima llamada, no un objeto.

Segundo, reduce es un método de matriz, no un objeto, y no puede confiar en el orden cuando itera sobre las propiedades de un objeto (ver: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Statements/for…inesto aplica a Objeto.claves además); así que no estoy seguro if aplicar reduce sobre un objeto tiene sentido.

Sin embargo, if el orden no es importante, puedes tener:

Object.keys(obj).reduce(function(sum, key) 
    return sum + obj[key].value;
, 0);

o simplemente puedes mapa el valor del objeto:

Object.keys(obj).map(function(key)  return this[key].value , obj).reduce(function (previous, current) 
    return previous + current;
);

PS en ES6 con la sintaxis de la función de flecha gruesa (ya en Firefox Nightly), puede reducirla un poco:

Object.keys(obj).map(key => obj[key].value).reduce((previous, current) => previous + current);

Posible respuesta

1:

[value:5, value:10].reduce((previousValue, currentValue) =>  return value: previousValue.value + currentValue.value)

>> Object value: 15

dos:

[value:5, value:10].map(item => item.value).reduce((previousValue, currentValue) => return previousValue + currentValue )

>> 15

3:

[value:5, value:10].reduce(function (previousValue, currentValue) 
      return value: previousValue.value + currentValue.value;
)

>> Object value: 15

Posible respuesta

Un objeto puede transformarse en array con: Objeto.entradas(), Objeto.claves(), Objeto.valores()y luego se reduce como array. Pero también puedes encoger un objeto sin crear un intermediario array.

Creé una pequeña biblioteca de ayuda. lo odio para trabajar con objetos.

npm install --save odict

Posee reduce función que funciona mucho como Array.prototype.reduce():

export const reduce = (dict, reducer, accumulator) => 
  for (const key in dict)
    accumulator = reducer(accumulator, dict[key], key, dict);
  return accumulator;
;

También puedes asignarlo a:

Object.reduce = reduce;

porque este método es muy útil!

Así que la respuesta a tu pregunta sería:

const result = Object.reduce(
  
    a: value:1,
    b: value:2,
    c: value:3,
  ,
  (accumulator, current) => (accumulator.value += current.value, accumulator), // reducer function must return accumulator
  value: 0 // initial accumulator value
);

Posible respuesta

Permítanme resumir las posibilidades. El objetivo es siempre hacer una array fuera del objeto. Hay varias funciones de objetos Javascript para esto. Para cada función individual, hay diferentes formas de interpretarla. Por lo tanto, siempre depende de cómo se vea nuestro objeto y de lo que queramos hacer.

En el ejemplo anterior, es un objeto con tres objetos.

const obj =  
    a: value: 1, 
    b: value: 2, 
    c: value:3 
;

Con Object.keys

Object.keys solo nos da las claves del objeto.

const arr = Object.keys(obj);
// output arr: 
[a, b, c]

const result = arr.reduce((total, key) => 
    return sum + obj[key].value;
, 0);
// output result
// 6

Con objeto.valor

Object.value() devuelve todos los valores en un array.

const arr = Object.value(obj);
// output arr
[
   value: 1,
   value: 2,
   value: 3,
]

const result = arr.reduce((total, singleValue) => 
   return total + singleValue.value;
, 0);

// output result
// 6

// Or the short variant
const resultShort = Object.values(obj).reduce((t, n) => t + n.value, 0)

// output resultShort
// 6

Con entradas de objetos.

Object.entries divide cada valor de objeto individual en un array.

const arr = Object.entries(obj)
// output arr
[
  ["a", visitors: 1],
  ["b", visitors: 2],
  ["c", visitors: 4]
]

const result = arr.reduce((total, singleArr) => 
  return total + singleArr[1].value;
, 0);

// output result
// 6

Si lo haces con reducción o con el array function map() depende de usted y de lo que quiera hacer.

Posible respuesta

Extender objeto.prototipo.

Object.prototype.reduce = function( reduceCallback, initialValue ) 
    var obj = this, keys = Object.keys( obj );

    return keys.reduce( function( prevVal, item, idx, arr ) 
        return reduceCallback( prevVal, item, obj[item], obj );
    , initialValue );
;

muestra de uso

var dataset = 
    key1 : 'value1',
    key2 : 'value2',
    key3 : 'value3'
;

function reduceFn( prevVal, key, val, obj ) 
    return prevVal + key + ' : ' + val + '; ';


console.log( dataset.reduce( reduceFn, 'initialValue' ) );
'Output' == 'initialValue; key1 : value1; key2 : value2; key3 : value3; '.

¡¡Disfrútenlo, muchachos!! 😉

Posible respuesta

Puede usar una expresión generadora (compatible con todos los navegadores durante años y en Node) para obtener los pares clave-valor en una lista que puede reducir a:

>>> a = "b": 3
Object  b=3

>>> [[i, a[i]] for (i in a) if (a.hasOwnProperty(i))]
[["b", 3]]

.
[ad_2]

nota: si aun no se resuelve tu pregunta por favor dejar un comentario y pronto le daremos una posible solucion , muchas gracias

eso es todo,espero que te funcione

¿Te ha resultado útil??

0 / 0

Deja una respuesta 0

Your email address will not be published. Required fields are marked *