Почему я не могу получить желаемый результат, я пробовал разные способы, но это не работает, в чем ошибка?
Дайте мне подсказку, чтобы я мог научиться.
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}'
]



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Поскольку вы создали переменную данных, а затем присвоили ей значение внутри цикла 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().
Надеюсь это поможет.
Прежде всего, результатом должен быть массив, а не одна строка. И поскольку у ФП есть проблемы с достижением этой цели, ответ, который более или менее просто говорит о том, что нужно делать это правильно, может оказаться бесполезным. Вместо этого вам следует включить код, показывающий, как решить проблему.
У вас есть некоторые ошибки:
toSorted() (sort() мутирует массив)gpu и laptop, поскольку они передаются в качестве аргументов.0, поэтому for(let i = 0...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, потому что именно так структурирован код ОП (и это может быть просто упрощенный пример). И вообще, вы хотите избежать того, чтобы что-либо в функции зависело от глобальных данных (за исключением значений, которые явно являются константами).
да, но оно не использует начальное значение устройства! Решение выше, хотя оно зависит от глобальных данных! Смотри device = laptop.toSorted()
@Петрос Я не писал ответ. Но я согласен, что laptop.toSorted() на самом деле должно быть device.toSorted()
@Petros пропустил, что также использовался глобальный laptop, исправлено
В приведенном выше фрагменте есть некоторые проблемы.
Прежде всего, вы передаете аргументы, но используете переменные класса. Поэтому, если вы намерены использовать переменные класса, аргументы не нужны.
Во-вторых, вы рассматриваете 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));
Вы почти там. Вам нужен массив строк в качестве выходных данных, но ваша переменная
dataпредставляет собой одну строку. Что вам нужно сделать, это инициализировать данные как пустой массив и помещать в него строки в цикле, вместо того, чтобы перезаписыватьdataна каждой итерации.