Lo siento, de antemano si el título no está claro, pero es difícil describirlo con palabras.
Lo que tengo:
const obj = { a: 5, b: 3, c: 0, d: 9 }Lo que quiero tener:
const arr = [[a, 5] ,[b, 3]]Básicamente, trato de escribir una función que me devuelva una serie de entradas, pero también cumple con los requisitos:
El primer punto es fácil para mí y puedo hacerlo por
Object.entries(obj).filter(([k, v])=> v !== 0)pero no puedo manejar con el segundo.
¿Puedo usar reduce aquí?
Puede usar un cierre y un IIFE para almacenar la suma
Object.entries(obj).filter((() => { let sum = 0; return ([k, v]) => { sum += v; return v !== 0 && sum < 10; }; })());Ejemplos:
function convert(obj) { return Object.entries(obj).filter((() => { let sum = 0; return ([k, v]) => { sum += v; return v !== 0 && sum < 10; }; })()); } const obj = { a: 5, b: 3, c: 0, d: 9 }; const arr = convert(obj); console.log(arr); const obj2 = { a: 0, b: 0, c: 8, d: 0, e: 1, f: 5 }; const arr2 = convert(obj2); console.log(arr2); const obj3 = { a: 12 }; const arr3 = convert(obj3); console.log(arr3);La respuesta de @jabaa es genial y deberías aceptarla.
Solo para confirmar tu intuición, podrías haber usado reduce , pero se complicaría bastante:
const obj = { a: 5, b: 3, c: 0, d: 9 } const result = Object.entries(obj).reduce( (o, newPair) => { o.sum += newPair[1]; newPair[1] !== 0 && o.sum < 10 && o.pairs.push(newPair); return o; }, { sum: 0, pairs: [] } ).pairs; console.log(result)