function generateJsonPatch(obj1, obj2) {
const patch = [];
// Рекурсивно обходим все свойства первого объекта
for (const prop in obj1) {
if (obj1.hasOwnProperty(prop)) {
// Если свойство отсутствует во втором объекте, удаляем его
if (!obj2.hasOwnProperty(prop)) {
patch.push({op: "remove", path: `/${prop}`, oldVal: obj1[prop]});
} else {
// Если свойство является объектом или массивом, рекурсивно обходим его
if (typeof obj1[prop] === "object") {
patch.push(...generateJsonPatch(obj1[prop], obj2[prop]).map(p => {
p.path = `/${prop}${p.path}`;
return p;
}));
} else {
// Если значение свойства отличается от значения во втором объекте, обновляем его
if (obj1[prop] !== obj2[prop]) {
patch.push({op: "replace", path: `/${prop}`, value: obj2[prop], oldVal: obj1[prop]});
}
}
}
}
}
// Обходим свойства второго объекта, которых нет в первом объекте
for (const prop in obj2) {
if (obj2.hasOwnProperty(prop) && !obj1.hasOwnProperty(prop)) {
// Добавляем новое свойство
patch.push({op: "add", path: `/${prop}`, value: obj2[prop], oldVal: undefined});
}
}
return patch;
}
[ { op: 'replace', path: '/colorQty', value: 1, oldVal: 0 } ]
Напиши функцию на javascript, которая принимает в себя два js-объекта или массива, на выходе я должен получить jsonpatch, который можно применить к первому объекту, чтобы получился объект идентичный второму
... вариант без oldValue ...
добавь ещё в каждую операцию jsonpatch и старое значение, чтобы при чтении было понятно, что на что заменяется
Вот обновлённый код функцииgenerateJsonPatch
с добавлением старого значения в каждую операцию jsonpatch:
function generateJsonPatch(obj1, obj2) { const patch = []; // Рекурсивно обходим все свойства первого объекта for (const prop in obj1) { if (obj1.hasOwnProperty(prop)) { // Если свойство отсутствует во втором объекте, удаляем его if (!obj2.hasOwnProperty(prop)) { patch.push({op: "remove", path: `/${prop}`, oldVal: obj1[prop]}); } else { // Если свойство является объектом или массивом, рекурсивно обходим его if (typeof obj1[prop] === "object") { patch.push(...generateJsonPatch(obj1[prop], obj2[prop]).map(p => { p.path = `/${prop}${p.path}`; return p; })); } else { // Если значение свойства отличается от значения во втором объекте, обновляем его if (obj1[prop] !== obj2[prop]) { patch.push({op: "replace", path: `/${prop}`, value: obj2[prop], oldVal: obj1[prop]}); } } } } } // Обходим свойства второго объекта, которых нет в первом объекте for (const prop in obj2) { if (obj2.hasOwnProperty(prop) && !obj1.hasOwnProperty(prop)) { // Добавляем новое свойство patch.push({op: "add", path: `/${prop}`, value: obj2[prop], oldVal: undefined}); } } return patch; }
Каждая операция jsonpatch теперь содержит поле `oldVal`, которое хранит старое значение свойства, которое было изменено. Если свойство было удалено или добавлено, то `oldVal` будет иметь значение `undefined`.
Пример использования:
const obj1 = {a: {b: "hello"}, c: [1, 2, 3]}; const obj2 = {a: {b: "world", d: "foo"}, c: [1, 2, 4, 5], e: "bar"}; const patch = generateJsonPatch(obj1, obj2); console.log(patch); // Output: // [ // {"op":"replace","path":"/a/b","value":"world","oldVal":"hello"}, // {"op":"add","path":"/a/d","value":"foo","oldVal":undefined}, // {"op":"remove","path":"/c/2","oldVal":3}, // {"op":"add","path":"/c/3","value":5,"oldVal":undefined}, // {"op":"add","path":"/e","value":"bar","oldVal":undefined} // ]
Обратите внимание, что полеoldVal
в jsonpatch содержит информацию только о тех свойствах, которые были изменены или удалены. Если свойство не было изменено, то егоoldVal
будет иметь значениеundefined
.
Не особо понимаю, так как в моей схеме 2 маршрутизатора и один имеет выход в интернет, нужен ли другому тоже? Будет ли он работать без него?
SELECT d.id, name, p.type, pp.price_b, pp.price_c, pp.price_d FROM device d
INNER JOIN (SELECT device_id, MAX(type) as "type" FROM price GROUP BY device_id) p ON p.device_id = d.id
INNER JOIN price pp ON pp.type = p.type AND pp.device_id = d.id
SELECT d.id,
CASE
WHEN p3.type IS NOT NULL THEN p3.type
WHEN p2.type IS NOT NULL THEN p2.type
WHEN p1.type IS NOT NULL THEN p1.type
END AS type,
CASE
WHEN p3.type IS NOT NULL THEN p3.price_b
WHEN p2.type IS NOT NULL THEN p2.price_b
WHEN p1.type IS NOT NULL THEN p1.price_b
END AS price_b,
CASE
WHEN p3.type IS NOT NULL THEN p3.price_c
WHEN p2.type IS NOT NULL THEN p2.price_c
WHEN p1.type IS NOT NULL THEN p1.price_c
END AS price_c,
CASE
WHEN p3.type IS NOT NULL THEN p3.price_d
WHEN p2.type IS NOT NULL THEN p2.price_d
WHEN p1.type IS NOT NULL THEN p1.price_d
END AS price_d
FROM device d
LEFT JOIN (SELECT device_id, type, price_b, price_c, price_d
FROM price WHERE type = 3) p3 ON d.id = p3.device_id
LEFT JOIN (SELECT device_id, type, price_b, price_c, price_d
FROM price WHERE type = 2) p2 ON d.id = p2.device_id
LEFT JOIN (SELECT device_id, type, price_b, price_c, price_d
FROM price WHERE type = 1) p1 ON d.id = p1.device_id
function getTimerEndFromNow(prompt) {
return getTimerEndFrom(new Date(), prompt);
}
function getTimerEndFrom(start, prompt) {
return new Date(start.valueOf() + getSecondsByPrompt(prompt) * 1000);
}
function getSecondsByPrompt(prompt) {
const [count, measure] = prompt.split(' ');
return count * getSecondsByMeasure(measure);
}
function getSecondsByMeasure(measure) {
switch(measure.toLowerCase()) {
case 'день': return 60 * 60 * 24;
case 'час': return 60 * 60;
case 'минута': return 60;
default: throw new Error(`Unknown measure ${measure}`);
}
}
/gpt
Мне нужно перевести значение "1 день"/"1 час"/"1 минута" в секунды для таймера. А точнее функция, но я вообще не знаю как это сделать. И еще одну функцию для того что бы например таймер получил сегодня а пишется во сколько он закончится, точнее например в 19.05.2023 1:42
Напиши функции на js
Для перевода "1 день"/"1 час"/"1 минута" в секунды можно использовать следующую функцию:
function convertToSeconds(time) { const timeArr = time.split(' '); const value = parseInt(timeArr[0]); const unit = timeArr[1]; switch (unit) { case 'день': return value * 24 * 60 * 60; case 'час': return value * 60 * 60; case 'минута': return value * 60; default: return 0; } }
Пример использования:
const secondsInDay = convertToSeconds('1 день'); // 86400 const secondsInHour = convertToSeconds('1 час'); // 3600 const secondsInMinute = convertToSeconds('1 минута'); // 60
Для форматирования даты в строку можно использовать объект `Date` и методы `getFullYear()`, `getMonth()`, `getDate()`, `getHours()`, `getMinutes()`, `getSeconds()`:
function formatDate(date) { const year = date.getFullYear(); const month = addLeadingZero(date.getMonth() + 1); const day = addLeadingZero(date.getDate()); const hours = addLeadingZero(date.getHours()); const minutes = addLeadingZero(date.getMinutes()); const seconds = addLeadingZero(date.getSeconds()); return `${day}.${month}.${year} ${hours}:${minutes}:${seconds}`; } function addLeadingZero(value) { return value < 10 ? '0' + value : value; }
Пример использования:
const endDate = new Date(2023, 4, 19, 1, 42, 0); const formattedDate = formatDate(endDate); // '19.05.2023 01:42:00'
При коннекте к www.site1.ru провайдеры через раз подключаются к правильному айпи, то к основному, то к резервному.
Соответственно где то на сайт заходит, где то нет так как конектится ко 2 айпи который в текущий момент сервер не использует.