Tengo la siguiente matriz con cientos de objetos.
const images = [ { "name" : "sky", "width" : "90", "height" : "150", "colours" : ["pink", "yellow", "red"], "price": "64" }, { "name" : "old car", "width" : "90", "height" : "150", "colours" : ["dark purple", "sand", "light green"], "price": "35" }, { "name" : "landscape", "width" : "90", "height" : "150", "colours" : ["dark blue", "violet"], "price": "85" }, { "name" : "kitchen", "width" : "90", "height" : "150", "colours" : ["red", "green"], "price": "38" }, ... ]Quiero crear una nueva matriz que tenga solo 10 objetos y solo algunos pares clave/valor (nombre, colores, precio). Los 10 objetos se pueden extraer usando otra matriz de números para usar como índice.
Aquí hay un ejemplo de matriz que contiene los índices:
randomNum = [4,24,39,82,92,27,123,22,84,65]La nueva matriz (resultado esperado) debería verse como algo similar a esto
data = [ { name: "landscape", colour: ["dark blue", "violet"], price: "85" }, { name: "kitchen", colour: ["red", "green"], price: "38" }, ... ]Estoy tratando de iterar
const finalList = []; //new array let quizItem; for (let i = 0; i < 10; i++) { quizItem= images[randomNum[i]]; finalList.push({name: quizItem.name, colour: quizItem.colour, price: quizItem.price); } Recibo un error que dice... undefined is not an object (evaluating 'quizItem.name')
Si en cambio solo uso quizList.push(quizItem); funciona bien y crea una nueva matriz con solo los 10 registros pero con todos los elementos del mismo objeto (pares clave/valor) que la matriz original.
El problema que enfrenta aquí es cuando accede a randomNum[i] , los valores que obtiene con randomNum[i] probablemente estén fuera de los límites de la lista de images . Por lo tanto, está intentando acceder a algo que no está allí o simplemente no está undefined . Como solución, puede generar una lista aleatoria de forma segura como se muestra a continuación y luego usarla para imprimir sus artículos.
const images = [ { "name": "sky", "width": "90", "height": "150", "colours": ["pink", "yellow", "red"], "price": "64" }, { "name": "old car", "width": "90", "height": "150", "colours": ["dark purple", "sand", "light green"], "price": "35" }, { "name": "landscape", "width": "90", "height": "150", "colours": ["dark blue", "violet"], "price": "85" }, { "name": "kitchen", "width": "90", "height": "150", "colours": ["red", "green"], "price": "38" } ]; generateRandomNumbersList = (size, maxValue) => { let randomNums = []; let currentNum; while (randomNums.length < size) { currentNum = Math.floor(Math.random() * maxValue); if (currentNum < maxValue) { randomNums.push(currentNum); } } return randomNums; } let randomNums = generateRandomNumbersList(10, images.length); const finalList = []; //new array let quizItem; for (let count = 0; count < 10; count++) { quizItem = images[randomNums[count]]; finalList.push({ name: quizItem.name, colour: quizItem.colours, price: quizItem.price }); } console.log(finalList);Su código debería funcionar bien con la corrección señalada en los comentarios. Además, no tiene una propiedad de colour en los objetos; pero tienes colours ; corregir eso también. También puede usar .map() de la siguiente manera:
const finalList = randomNum.map(n => images[n]) .map(({name, colours, price}) => ({name, colours, price});