Tengo la siguiente matriz de objetos:
[{"id":0,"name":"Katy","age":22}, {"id":2,"name":"Lucy","age":12}, {"id":1,"name":"Jenna","age":45}, {"id":3,"name":"Ellie","age":34}] Necesito agregar otra clave a los objetos ( PaymentCategory ) donde el objeto que tenga la ID más baja se agrega la clave con el valor "Efectivo", el que tiene la ID más alta "Tarjeta" y todo lo demás entre "Cheque"; la matriz también debe ordenarse por ID.
Por lo tanto, la salida requerida sería:
[{"PaymentCategory":"Cash","id":0,"name":"Katy","age":22}, {"Payment Category":"Cheque","id":1,"name":"Jenna","age":45}, {"Payment Category":"Cheque","id":2,"name":"Lucy","age":12}, {"Payment Category":"Card","id":3,"name":"Ellie","age":34}]¿Cómo podemos lograr este resultado de la manera más eficiente, es decir, con el menor número de iteraciones y el mayor rendimiento?
Esto es lo que probé:
const min = array.reduce((prev,curr)=> prev.id<curr.id?prev:curr) const max = array.reduce((prev,curr)=> prev.id>curr.id?prev:curr) min.PaymentCategory = "Cash" max.PaymentCategory = "Credit" const result =[min, max]El problema con esto es:
max , uno para min .El siguiente enfoque proporcionado es sencillo y primero sort los elementos de una copia de matriz superficial ( [...sampleData] ) en orden ascendente ( .sort((a, b) => a.id - b.id) ) de valores id .
La tarea final map cada artículo (ordenado) de una manera que crea una copia superficial ( { ...item } ) y además crea una entrada 'Payment Category' donde al primer artículo ( idx === 0 ) se le asigna el Valor 'Cash' , al último artículo ( (idx === arr.length - 1) ) se le asigna el valor 'Card' , y a todos los demás se les asigna el valor 'Cheque' .
El enfoque completo no muta los datos proporcionados originalmente...
const sampleData = [ { id: 0, name: "Katy", age: 22 }, { id: 2, name: "Lucy", age: 12 }, { id: 1, name: "Jenna", age: 45 }, { id: 3, name: "Ellie", age: 34 }, ]; console.log( 'mapped `sampleData` items ...', [...sampleData] .sort((a, b) => a.id - b.id) .map((item, idx, arr) => ({ ...item, 'Payment Category': ((idx === 0) && 'Cash') || ((idx === arr.length - 1) && 'Card') || 'Cheque', })) ); console.log('unmutated `sampleData` ...', sampleData); .as-console-wrapper { min-height: 100%!important; top: 0; }El enfoque anterior de una manera aún más legible ...
const copyItemAndAugmentPaymentCategory = (item, idx, arr) => ({ ...item, 'Payment Category': ((idx === 0) && 'Cash') || ((idx === arr.length - 1) && 'Card') || 'Cheque', }); const compareItemIdPrecedenceAscending = (a, b) => a.id - b.id; console.log( [ { id: 0, name: "Katy", age: 22 }, { id: 2, name: "Lucy", age: 12 }, { id: 1, name: "Jenna", age: 45 }, { id: 3, name: "Ellie", age: 34 }, ] .sort(compareItemIdPrecedenceAscending) .map(copyItemAndAugmentPaymentCategory) ); .as-console-wrapper { min-height: 100%!important; top: 0; }puedes hacer esto
const array =[{"id":0,"name":"Katy","age":22}, {"id":2,"name":"Lucy","age":12}, {"id":1,"name":"Jenna","age":45}, {"id":3,"name":"Ellie","age":34}] const arrayLength= array.length const newA=array.map( (element,index) => { if (index===0) return {"PaymentCategory":"Cash", ...element} else if ( index===arrayLength-1 )return {"PaymentCategory":"Card", ...element} else return {"PaymentCategory":"Cheque", ...element}})verifique el método de mapa en matrices para obtener más información: https://learnjsx.com/category/2/posts/es6-mapFunction