Функция не заменяет элементы массива элементами другого массива по условию - PullRequest
0 голосов
/ 25 апреля 2020

Добрый день. Мне нужно сделать функцию, которая будет принимать два массива и контролировать, если дата элемента первого массива равна дате элемента второго массива, то элемент первого массива должен быть заменен элементом второй массив, если даты не совпадают, то элемент первого массива будет заменен пустым объектом. Например, есть два массива.

let array1 = [
    {
        date: '2020-04-20',
        groups: ['apple', 'banana'],
        teachers: ['potate', 'carrot'],
    },
    {
        date: '2020-04-21',
        groups: [],
        teachers: [],
    },
    {
        date: '2020-04-22',
        groups: ['tomato', 'peach'],
        teachers: ['orange', 'cucumber'],
    },
];
let array2 = [
    {
        date: '2020-04-20',
        groups: ['car', 'plane'],
        teachers: ['drive', 'fly'],
    },
    {
        date: '2020-04-21',
        groups: ['lalal', 'kykyky'],
        teachers: ['lalal', 'kykyky'],
    }
];

Два вышеуказанных массива принимаются функцией, и функция должна возвращать такой массив:

let expectResult = [
    {
        date: '2020-04-20',
        groups: ['car', 'plane'],
        teachers: ['drive', 'fly'],
    },
    {
        date: '2020-04-21',
        groups: ['lalal', 'kykyky'],
        teachers: ['lalal', 'kykyky'],
    }
    {
        date: '2020-04-22',
        groups: [],
        teachers: [],
    },
]

Спасибо заранее за вашу помощь.

Вот что я сделал сам:

let payload = [];
    for (let i = 0; i < payload.length; i++) {
        for (let j = 0; j < combineArrays.length; j++) {
            if (payload[i].date === combineArrays[j].date) {
                console.log(i, j);
                finalArray.splice(i - 1, 1, combineArrays[j]);
            } else {
                finalArray.splice(i - 1, 1,{
                    date: payload[i].date,
                    groups: [],
                    teachers: [],
                    time: [],
                    type: [],
                });
            }
        }
    }

Ответы [ 2 ]

0 голосов
/ 25 апреля 2020

let array1=[{date:"2020-04-20",groups:["apple","banana"],teachers:["potate","carrot"]},{date:"2020-04-21",groups:[],teachers:[]},{date:"2020-04-22",groups:["tomato","peach"],teachers:["orange","cucumber"]}],array2=[{date:"2020-04-20",groups:["car","plane"],teachers:["drive","fly"]},{date:"2020-04-21",groups:["lalal","kykyky"],teachers:["lalal","kykyky"]}];

let tempEl
let result = array1.map(el1 => {
    tempEl = array2.find(el2 => el2.date == el1.date)
    if(!tempEl){
        return {date: el1.date, groups: [], teachers: []}
    }else{
        return tempEl
    }
})

console.log(result)
0 голосов
/ 25 апреля 2020
  1. Сравнение элементов массива по индексу

    • Я считаю, что ваши ошибки происходят из-за разного размера массива.
    • то есть вы пытаетесь получить доступ к массиву [ index] вне границ
    • , поэтому вам нужно проверить, является ли массив в индексе в B нулевым / неопределенным
  2. Сделайте то, что вам нужно сделать (замените console.log со сбросом на пустой объект в соответствии с вашими требованиями)

// A and B are array 1 and 2 respectively, and i is the index

for (i in A) {
  if (B[i] != null) { // -> this is the check you're missing
    if (A[i].date != B[i].date) {
      console.log(A[i].date); // -> here you do what you need
    }
  }
}

Также обратите внимание, что здесь предполагается, что элементы также находятся в точном порядке и идеально совпадают. Если это не так, лучше использовать find согласно ответу символической ссылки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...