Массив циклических функций Javascript

Почему я не могу получить желаемый результат, я пробовал разные способы, но это не работает, в чем ошибка?

Дайте мне подсказку, чтобы я мог научиться.

let laptop = ["asus", "lenovo", "acer", "hp", "axioo"];
let gpu = [4070, 4090, 4050, 4080, 4060];

const laptopGpu  = (device, gra) => {
  device = laptop.sort()
  gra = gpu.sort()
  let data = ""
  for(let i = 1; i < device.length; i++) {
    data = `{${device[i]} with gpu ${gra[i]}}`
  }
  return new Array (data)
}
console.info(laptopGpu(laptop,gpu));

Это результат, который я хочу:

[ 
  '{acer with gpu 4050}',
  '{asus with gpu 4060}',
  '{axioo with gpu 4070}', 
  '{hp with gpu 4080}',
  '{lenovo with gpu 4090}'
]

Вы почти там. Вам нужен массив строк в качестве выходных данных, но ваша переменная data представляет собой одну строку. Что вам нужно сделать, это инициализировать данные как пустой массив и помещать в него строки в цикле, вместо того, чтобы перезаписывать data на каждой итерации.

Michele Bolognini 06.06.2024 09:29
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
1
91
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Поскольку вы создали переменную данных, а затем присвоили ей значение внутри цикла for, каждый раз, когда цикл запускается, он переопределяет последнее значение. Вместо этого создайте массив и поместите значения в этот массив.

let laptop = ["asus", "lenovo", "acer", "hp", "axioo"];
let gpu = [4070, 4090, 4050, 4080, 4060];

 
const laptopGpu  = (device, gra) => {
    device = laptop.sort()
    gra = gpu.sort()

    let data = []

    for(let i = 0; i < device.length; i++) {
       data.push(`{${device[i]} with gpu ${gra[i]}}`)
    }

    return data
}

console.info(laptopGpu(laptop, gpu));

Я обновил свой ответ до более полезного решения.

let laptops = ["asus", "lenovo", "acer", "hp", "axioo"];
let gpus = [4070, 4090, 4050, 4080, 4060];

class Laptop{
    #laptop;
  #gpu;
  
    constructor(laptop, gpu){
  this.#laptop = laptop;
  this.#gpu = gpu;
  }
  
   toString() {
    return `{${this.#laptop} with gpu ${this.#gpu}}`;
  }
  
}

const laptopGpu  = (device, gra) => {
  device = laptops.sort()
  gra = gpus.sort()

  return device.map((laptop, index) => new Laptop(laptop, gra[index]) );
}

laptopGpu(laptops, gpus).forEach(laptop => console.info(laptop.toString()));

В этом примере я сохраняю каждый ноутбук как объект и перезаписываю метод toString().

Надеюсь это поможет.

Прежде всего, результатом должен быть массив, а не одна строка. И поскольку у ФП есть проблемы с достижением этой цели, ответ, который более или менее просто говорит о том, что нужно делать это правильно, может оказаться бесполезным. Вместо этого вам следует включить код, показывающий, как решить проблему.

t.niese 06.06.2024 09:35
Ответ принят как подходящий

У вас есть некоторые ошибки:

  1. Не изменяйте переданные аргументы, поэтому используйте toSorted() (sort() мутирует массив)
  2. Не используйте глобальные gpu и laptop, поскольку они передаются в качестве аргументов.
  3. Массивы JS начинаются с 0, поэтому for(let i = 0...
  4. Ваш вывод представляет собой массив, поэтому data должен быть массивом и используйте push() для массива:

let laptop = ["asus", "lenovo", "acer", "hp", "axioo"];
let gpu = [4070, 4090, 4050, 4080, 4060];

 
const laptopGpu  = (device, gra) => {
    device = device.toSorted()
    gra = gra.toSorted()

    let data = [];

    for(let i = 0; i < device.length; i++) {
       data.push(`{${device[i]} with gpu ${gra[i]}}`);
    }

    return data;
}

console.info(laptopGpu(laptop,gpu));

Зачем передавать ноутбук и графический процессор? С учетом вышеизложенного вы можете не указывать аргументы для ноутбукаGpu.

Petros 06.06.2024 09:35

@Petros, потому что именно так структурирован код ОП (и это может быть просто упрощенный пример). И вообще, вы хотите избежать того, чтобы что-либо в функции зависело от глобальных данных (за исключением значений, которые явно являются константами).

t.niese 06.06.2024 09:39

да, но оно не использует начальное значение устройства! Решение выше, хотя оно зависит от глобальных данных! Смотри device = laptop.toSorted()

Petros 06.06.2024 09:41

@Петрос Я не писал ответ. Но я согласен, что laptop.toSorted() на самом деле должно быть device.toSorted()

t.niese 06.06.2024 09:42

@Petros пропустил, что также использовался глобальный laptop, исправлено

Alexander Nenashev 06.06.2024 09:44

В приведенном выше фрагменте есть некоторые проблемы.

  • Прежде всего, вы передаете аргументы, но используете переменные класса. Поэтому, если вы намерены использовать переменные класса, аргументы не нужны.

  • Во-вторых, вы рассматриваете data как строку, поэтому ей присваивается только результат последней итерации.

  • В-третьих, вы начинаете цикл с позиции 1, поэтому первые вхождения обоих массивов пропускаются.

Посмотрите ниже. Надеюсь, это поможет вам понять, в чем заключались проблемы.

let laptop = ["asus", "lenovo", "acer", "hp", "axioo"];
let gpu = [4070, 4090, 4050, 4080, 4060];

 
const laptopGpu  = (device, gra) => {
    device = device.sort()
    gra = gra.sort()

    let data = []

    for(let i = 0; i < device.length; i++) {
       data.push( `{${device[i]} with gpu ${gra[i]}}`)
    }

    return data
}

console.info(laptopGpu(laptop,gpu));

Вы также можете использовать Array#map следующим образом:

let laptop = ["asus", "lenovo", "acer", "hp", "axioo"];
let gpu = [4070, 4090, 4050, 4080, 4060];

 
const laptopGpu  = (device, gra) => {
    const g = gra.toSorted();
    const data = device.toSorted().map(
        (d,i) => `{${d} with gpu ${g[i]}}`
    );

    return data;
}

console.info(laptopGpu(laptop,gpu));

Другие вопросы по теме

Похожие вопросы

React Native BLE Manager: проблема обратного вызова записи обновления по беспроводной сети
Функция JQuery для прохождения лезвия Laravel
Alpine.js: ошибка «фрукт не определен» при использовании директивы x-sort в режиме устройства Chrome Dev Tools
Как разместить дочерний элемент CSS-сетки после строки другого дочернего элемента?
Angular MongoDB меняет идентификатор данных ответа, но все равно получает идентификатор данных запроса
Отключить наведение курсора Autodesk Viewer Online — инструмент «Инспектор» — инструмент разработчика
Приложение Todo: как динамически добавлять флажок и ввод текста при нажатии клавиши Enter в HTML с помощью JavaScript?
Можно ли импортировать переменные из модулей ES6 непосредственно в консоль Chrome DevTools для целей отладки? (в чистом HTML, проекте JS)
NextRouter не был установлен при использовании перехватчика useRouter из next/router
Изменение размера изображения при прокрутке