const text = "{a:[1,2,{b:3}],c:{d:4},\"e\":\"qqq\"}";
const json = text.replace(/(?<=[\{,]\s*)([^",\{]*?)(?=\s*:)/g, a=>{
return '"'+a+'"';
});
console.log(text); // {a:[1,2,{b:3}],c:{d:4},"e":"qqq"}
console.log(json); // {"a":[1,2,{"b":3}],"c":{"d":4},"e":"qqq"}
const obj = JSON.parse(json);
const km = [25, 45, 95, 125, 150, 200, 325, 250, 165, 350]
const cof = [1, 1.5, 1, 1.5, 1.2, 1.5, 1 , 0.5, 1.2, 1.5];
// как то так
const res = cof.reduce((a,v,i)=>(a[v]=(a[v]||0)+km[i],a),{});
console.log(res); // { 1: 445, "1.5": 720, "1.2": 315, "0.5": 250 }
console.log(Object.values(res)); // [445, 720, 315, 250];
const person = {
id: 29,
name: "John",
role: "Admin",
salary: 999
};
const templatesSet = [
"/items/%id%/%name%",
"/items/%id%/%role%",
"/items/%id%/%salary%"
];
const pathes = templatesSet.map(t => t.replace(/%(.*?)%/g, (s,k)=>person[k]));
console.log(pathes); // [ "/items/29/John", "/items/29/Admin", "/items/29/999" ]
let promise = new Promise(foo);
promise.then(result => {
alert('done')
});
function foo(resolve, reject) {
$.ajax({
url: ......,
type: 'get',
dataType: 'json',
data: data,
success: function(data) {
// ....
resolve(data);
},
error: function(xhr, textStatus, errorThrown) {
// ...
reject(textStatus);
}
}
}
let promise = new Promise(function (resolve, reject) {
$.ajax({
url: ......,
type: 'get',
dataType: 'json',
data: data,
success: function(data) {
// ....
resolve(data);
},
error: function(xhr, textStatus, errorThrown) {
reject(textStatus);
}
}
});
promise.then(result => {
alert('done')
});
let promise = new Promise(function (resolve, reject) {
foo(resolve, reject);
});
promise.then(result => {
alert('done')
});
function foo(resolve, reject) {
$.ajax({
url: ......,
type: 'get',
dataType: 'json',
data: data,
success: function(data) {
// ....
resolve(data);
},
error: function(xhr, textStatus, errorThrown) {
// ...
reject(textStatus);
}
}
}
var drowSnowman = function(posX, posY) {
function drawCircle(x, y, radius, fillCirсle) {
ctx.beginPath();
if (fillCirсle === true) {
ctx.lineWidth = 4;
ctx.arc(x, y, radius, 0, Math.PI * 2, false);
ctx.stroke();
} else if (fillCirсle === false) {
ctx.arc(x, y, radius, 0, Math.PI * 2, false);
ctx.fill();
}
};
drawCircle(posX+100, posY+100, 30, true);
ctx.fillStyle = "orange";
drawCircle(posX+100, posY+105, 5, false);
ctx.fillStyle = "black";
drawCircle(posX+90, posY+95, 5, false);
drawCircle(posX+110, posY+95, 5, false);
drawCircle(posX+100, posY+170, 40, true);
drawCircle(posX+100, posY+150, 5, false);
drawCircle(posX+100, posY+170, 5, false);
drawCircle(posX+100, posY+190, 5, false);
};
drowSnowman(200,150);
drowSnowman(500,450);
Этот метод позволяет точно добавлять или изменять свойства объекта. Обычное добавление свойств через присваивание создаёт свойства, которые можно увидеть через перечисление свойств (с помощью цикла for...in или метода Object.keys), чьи значения могут быть изменены и которые могут быть удалены. Этот же метод позволяет настроить эти дополнительные детали свойства.
...
enumerable
Равен true только в том случае, если это свойство можно увидеть через перечисление свойств содержащего его объекта.
Значение по умолчанию установлено в false.
Object.defineProperty(obj, 'test', {value: 1, enumerable: true});
Object.defineProperty(obj, 'test2', {value: 1, enumerable: true});
function testIntersection(elem1, elem2, cb){
// получаем координаты первого и второго элемента
let box1 = elem1.getBoundingClientRect();
let box2 = elem2.getBoundingClientRect();
let isIntersection = true;
// если нижняя грань первого элемента выше чем верхняя грань второго - НЕПЕРЕСЕКАЮТСЯ
if ( box1.bottom < box2.top ){ isIntersection=false; }
// если верхняя грань первого элемента ниже чем нижняя грань второго - НЕПЕРЕСЕКАЮТСЯ
if ( box1.top > box2.bottom ){ isIntersection=false; }
// если правая грань первого элемента левее чем левая грань второго - НЕПЕРЕСЕКАЮТСЯ
if ( box1.right < box2.left ){ isIntersection=false; }
// если левая грань первого элемента правее чем правая грань второго - НЕПЕРЕСЕКАЮТСЯ
if ( box1.left > box2.right ){ isIntersection=false; }
// если всеже пересекаются, выполняем колбэк функцию
if( isIntersection ){
cb();
}
}
/**
* функция добавляет код скрипта на страницу предварительно удаляя из него указанные куски текста,
* @param {string} url полные URL добавляемого скрипта
* @param {string} replaces массив со строками, которые будут удалены (заменены на пустоту)
*/
function addScript( url , replaces=[]) {
// получаем текст добавляемого на страницу скрипта
fetch(url)
.then(response=>{
return response.text();
})
.then(text=>{
// готовим регулярку для замены всех вхождени из массива replaces
const restr = "("+replaces.join("|")+")";
const regex = new RegExp(restr, "g");
// заменяем в тексте скрипта все вхождения из массива replaces
const code = text.replace(regex,"");
// получаем указатель на head страницы
let head = document.getElementsByTagName( 'head' )[ 0 ];
// создаем новый элемент script
let script = document.createElement( 'script' );
script.charset="utf-8";
script.type = 'text/javascript';
//script.src = url;
script.innerHTML = code;
// добавляем измененный скрипт на страницу
head.appendChild( script );
});
}
// Используем заготовку
// например у нас есть сторонний скрипт, который нам надо добавить на страницу => https://external.domain/js/needed.js
// но он запускаясь подгружает не нужные нам скрипты https://external.domain/js/unnecessary.js и https://external.domain/js/advertising.js
// тогда делаем так
addScript(
"https://external.domain/js/needed.js",
[
"unnecessary.js",
"advertising.js"
]
);
// ну и на последок. Вы должны понимать что данное решение не панацея и его легко обойти
// например "вредные" скрипты могут иметь случайносгенерированное имя
// так же хочу предупредить, что данное решение будет сыпать ошибки в консоль, так как после удаления
// из кода загружаемого скрипта строк с именами файлов вредных скриптов, код который их загружает
// не сможет этого сделать.
// так же данный свособ может привести к частичной или полной неработоспособности полезного скрипта
// например если полезный скрипт использует функции из подгружаемых вредных скриптов
// или если в полезном скрипте есть переменные или функции с именами, аналогичными удаляемым скриптам
// и т.д. и т.п.
import React, { useState } from 'react';
import './styles.css';
function debounce(fn, ms, ...args) {
let timer;
return (value) => {
timer = setTimeout(() => {
// ваш вариант вообще забывал о том что в fn вы пытаетесь передать value
fn.apply(this, [value,...args]);
// удалять обработчик таймаута вообще не надо, но если это всетаки делать, то наверное уже после того как
clearTimeout(timer);
timer = null;
}, ms);
};
}
export default function App() {
const [value, setValue] = useState('');
const handleChange = e => {
const {value} = e.target;
delayHandler(value);
};
const delayHandler = debounce(value=>{
setValue(value);
alert(value);
}, 2000);
return (
<div className="App">
<p>Current value: {value}</p>
<form>
<input onChange={handleChange} />
</form>
</div>
);
}
function debounce(fn, ms) {
return (...args) => {
setTimeout(() => {
fn.apply(this, args);
}, ms);
};
}
var el = document.querySelector("div.card__owerlay-wrapper a.card-do__btn.print__btn");