Добавление свойства из одного массива с объектами в другой на основе значения

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