#javascript #массивы #сравнение
Например, есть 2 массива: var days = ["Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота", "Воскресенье"]; var work_days = ["Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Рабочие дни"]; Как их сравнить и вывести результат: "Суббота", "Воскресенье", "Рабочие дни"
Ответы
Ответ 1
Можно примерно так: var days = ["Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота", "Воскресенье"]; var work_days = ["Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Рабочие дни"]; document.body.innerText = JSON.stringify( diff(days, work_days)); function diff( a, b) { var diff = a.filter((e)=>!~b.indexOf(e)); return diff.concat(b.filter((e)=>!~a.indexOf(e))); } В функцию сравнения diff() передаём оба массива. Там с помощью метода .filter(), сначала отбираются те элементы a, которых нет в b. А затем к полученным добавляются наоборот – те из b, которых нет в a. Использованы методы: склейка массивов .concat(), фильтр массива .filter()Ответ 2
Можно подготовить один из массивов и собрать из него объект, с помощью функции reduce, это позволит избавиться от indexOf var days = ["Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота", "Воскресенье" ]; var work_days = ["Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Рабочие дни" ]; document.body.innerText = JSON.stringify(diff(days, work_days)); function diff(a, b) { var m = days.reduce(function(a, d) { a[d] = 1; return a; }, {}); var r = work_days.reduce(function(acc, el) { delete acc.rest[el]; if (!acc.m[el]) acc.result.push(el); return acc; }, { m: m, result: [], rest: Object.assign({}, m) }); return r.result.concat(Object.keys(r.rest)); }Ответ 3
Операция известная и реализована в куче библиотек. Один из вариантов — lodash.xor: var days = ["Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота", "Воскресенье"]; var work_days = ["Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Рабочие дни"]; var result = _.xor(days, work_days); alert(result);Ответ 4
решение за O(n) по времени и O(n) по памяти и требующее не повторящихся элементов в массивах. var days = ["Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота", "Воскресенье"]; var workDays = ["Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Рабочие дни"]; var diff = []; var daysAsKeys = new Map(); // need ES6 days.forEach(function(day) { daysAsKeys.set(day, true); }); var workDaysAsKeys = new Map(); workDays.forEach(function(workDay) { workDaysAsKeys.set(workDay, true); }); days.forEach(function(day) { if (!workDaysAsKeys.has(day)) diff.push(day); }); workDays.forEach(function(workDay) { if (!daysAsKeys.has(workDay)) diff.push(workDay); }); alert(diff)
Комментариев нет:
Отправить комментарий