【问题标题】:Create an array based on another array with less elements基于另一个元素较少的数组创建一个数组
【发布时间】:2022-01-03 02:24:17
【问题描述】:

我有以下包含数百个对象的数组

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"
  },
...
]

我想创建一个只有 10 个对象和一些键/值对(名称、颜色、价格)的新数组。可以使用另一个数字数组作为索引来提取这 10 个对象。

这是一个包含索引的数组示例:

randomNum = [4,24,39,82,92,27,123,22,84,65]

新数组 - 预期结果 - 应该类似于此

data = [
  {
      name: "landscape",
      colour: ["dark blue", "violet"],
      price: "85"
  },
  {
      name: "kitchen",
      colour: ["red", "green"],
      price: "38"
  },
  ...
]

我正在尝试迭代

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);  
}

我收到一条错误消息...undefined is not an object (evaluating 'quizItem.name')

如果我只是使用quizList.push(quizItem);,它可以正常工作并创建一个新数组,其中只有 10 条记录,但所有对象的项(键/值对)与原始数组相同。

【问题讨论】:

  • 请修复此问题 finalList.push({...);到 finalList.push({...});
  • 这不是问题,只是这篇文章中的一种类型。
  • colour 不会是 quizItem 的属性,但 colours 会。
  • 您遇到的错误是否可重现?如果是,请提供代码 sn-p。

标签: javascript arrays javascript-objects


【解决方案1】:

您在这里面临的问题是当您访问randomNum[i] 时,您使用randomNum[i] 获得的值可能超出了images 列表的范围。因此,您试图访问不存在的东西或只是undefined。作为一种解决方案,您可以安全地生成如下所示的随机列表,然后使用它来打印您的项目。

    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);

【讨论】:

  • 这不是问题,因为我已经在检查最大值了。事实上,作为测试,我已经用虚拟数组 const randomNums = [3,45,34,23,28,83,54,67,87,11]; 替换了随机处理,但仍然未定义
  • 试试这个:console.log(images[randomNums[i]]) 如果仍然显示undefined,则打印索引再次确认。
【解决方案2】:

您的代码应该可以正常使用 cmets 中指出的更正。 另外,您在对象中没有colour 属性;但你有colours;也更正它。您也可以使用.map(),如下所示:

const finalList = randomNum.map(n => images[n])
.map(({name, colours, price}) => ({name, colours, price});

【讨论】:

  • 仍然给我一个空数组作为结果。我认为问题可能出在数组的格式上。它推动整个对象,它不会引起任何问题,因此我得到了一个全新的数组,其中只有这 10 个对象,但里面有所有元素。顺便说一句,这两个功能(你的和我的)都是一样的。控制台中数组的格式有点奇怪images: Array [ Object { "name" ...}, Object {...},...]
  • 在这种情况下,您能否运行console.log( JSON.stringify(images[0]) ) 来获取对象的正确结构。
  • 它现在可以工作了,但我不得不再次迭代一个单独的函数。所以现在我正在做finalList.push(quizItem) 并将其保存在某个地方。然后遍历新变量,现在可以毫无问题地指向各个对象。似乎是某种运行时问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-02
  • 1970-01-01
相关资源
最近更新 更多