Exporter\ExcelFormatter
? window
, если глобальная), и менять её содержимое не в оригинальном объекте, а в его прокси. Может, даже заменить исходный объект на его прокси (не получится, если window
).reduce()
выполнится для каждой буквы: a, b, c и d.i
попадает очередная буква.part
первый раз туда попадает пустой объект obj
. И ссылка на него сохраняется - её и вернём как результат.reduce
функцию можно так переписать, делает то же самое: function (part, i) {
const empty = {}; // новая матрёшка
part[i] = empty; // вложили её в предыдущую
return empty; // новая матрёшка станет part'ом при следующем вызове
}
/..?/
получить все пары букв (и огрызок в хвосте, если нечетное), а в функции первую из двух делать strtolower()
, а вторую strtoupper()
:echo preg_replace_callback(
'/..?/',
function ($match) {
return strtolower($match[0][0]) . strtoupper($match[0][1]);
},
"Lorem ipsum dolor sit amet consectetur adipisicing elit."
);
// lOrEm iPsUm dOlOr sIt aMeT CoNsEcTeTuR AdIpIsIcInG ElIt.
-vf "drawtext=text=string1 string2 string3 string4 string5 string6 string7 :expansion=normal:fontfile=foo.ttf: y=h-line_h-10:x=(mod(5*n\,w+tw)-tw): fontcolor=white: fontsize=40: shadowx=2: shadowy=2"
viaffmpeg \
-i source_video.mp4 \
-vf........ (та длинная строка выше) \
-c:v libx264 \
-movflags +faststart \
-c:a aac \
-hide_banner \
output.mp4
(N * p1) % p2
14, 28, 42, 56, 70, 1, 15, 29, 43
const p1 = 97;
const p2 = 83;
const pass = [];
for (let n = 1; n < 10; n++) pass.push((n * p1) % p2);
reduce()
объект триггеров с тремя ключами, по каждому из ключевых слов. Перед вставкой очередной пары с ключом из триггеров, переводить его в true. Если он до этого уже включён — значит, пора вставлять новый объект для заполнения.const data = [
{name: "name", value: "John"},
{name: "last_name", value: "Snow"},
{name: "father_name", value: ""},
{name: "name", value: "Tony"},
{name: "last_name", value: "Stark"},
{name: "father_name", value: ""},
{name: "other_field", value: "damn"},
];
data.reduce((acc, c) => {
if (true === acc.triggers[c.name]) {
Object.keys(acc.triggers).forEach((key) => acc.triggers[key] = false);
acc.arr.push({});
}
if (c.name in acc.triggers) acc.triggers[c.name] = true;
acc.arr[acc.arr.length - 1][c.name] = c.value;
return acc;
}, {
triggers: {
"name": false,
"last_name": false,
"father_name": false,
},
arr: [{}],
}).arr;
/*
[
{
"name": "John",
"last_name": "Snow",
"father_name": ""
},
{
"name": "Tony",
"last_name": "Stark",
"father_name": "",
"other_field": "damn"
}
]
*/
var foo;
var foo = 1; // можно стереть
function bar() {
var foo; // всплыло сюда. Этот foo – иной, чем верхний foo!
if (!foo) { // тут foo undefined, !foo === true
foo = 10; // выполняется, назначается 10
}
console.log(foo); // вывели 10
}
bar(); //--> 10