#javascript #arrays #loops #object
#javascript #массивы #петли #объект
Вопрос:
У меня есть два массива объектов, подобных этому:
let test = [
{Course: "", Week: "1", Hours: ""},
{Course: "", Week: "2", Hours: ""},
{Course: "", Week: "3", Hours: ""}
]
let values = [{Course: "A", Week: "3", Hours: "1"}]
Я хочу добавить свойство из массива «значения» в массив «тест, чтобы результат был:
let test = [
{Course: "", Week: "1", Hours: ""},
{Course: "", Week: "2", Hours: ""},
{Course: "", Week: "3", Hours: "1"}
]
Возможно ли это? Причина, по которой у меня это так, заключается в том, что мне нужно указать все недели в начале, и значения будут добавлены от пользователя.
Комментарии:
1. Почему курс не изменен в выводе
2. Изменяется только одно свойство, поэтому вы можете использовать test[2]. Часы = значения [0]. Часы
Ответ №1:
Сначала создайте недели сопоставления объектов с объектами для быстрого поиска, а затем просто выполните цикл по values
массиву:
const lookup = {};
for (const val of test) {
lookup[val.week] = val;
}
for (const val of values) {
const cur = lookup[val.week];
for (const key in val) {
if (key === "Hours") {
cur[key] = (Number(cur[key]) Number(val[key])).toString();
} else {
cur[key] = val[key];
}
}
}
Комментарии:
1. Спасибо! Но если у меня есть два значения с той же неделей? Например. пусть значения = [{Курс: «A», Неделя: «3», Часы: «1»}, {Курс: «A», Неделя: «5», Часы: «1»}, {Курс: «A», неделя: «5»,Часы: «1»}] Тогда, я думаю, он их не добавляет
2. Если у вас есть несколько значений с одной и той же неделей, то какова ваша цель? Это перезаписать оба?
3. @egx Каково ожидаемое поведение, когда два значения имеют одну и ту же неделю?
4. Затем моя цель состояла бы в том, чтобы добавить часы в том же значении. Итак, у меня было бы {Курс: «A», Неделя: «5», Часы: «2»}, если у меня есть значения недели 5 с 1 часом в них
5. Это останется прежним. Таким образом, он считает только часы, основанные на неделях. Курс на самом деле не так важен, скорее значение часов в неделях.
Ответ №2:
Перебирайте значения — найдите тест, соответствующий неделе текущего значения, и установите часы в часы значения
values.forEach((value) => {
//Find the test that matches current value's week and set hours to value's hours
test.find(test => test.Week === val.Week).Hours = value.Hours);
});
Ответ №3:
Вы можете просто использовать array .найти функцию.
let test = [
{Course: "", Week: "1", Hours: ""},
{Course: "", Week: "2", Hours: ""},
{Course: "", Week: "3", Hours: ""}
]
let values = [{Course: "A", Week: "3", Hours: "1"}]
var current = test.find((item) => {
return item.Week === values[0].Week
})
current.Hours = values[0].Hours;
console.log(test)