for .. in
перебирает имена свойств объекта ('a', 'b', 'c', ...)for .. of
toString()
:const num = 10; // число
num.toString() // результат "10" – строка текста
Object.values(obj).reduce((acc, c) => acc + c.toString().match(/^[12]/), 0) // 2
но здесь используется тяжёлый механизм регулярных выражений, хотя вполне можно без него; и неочевидное приведение типа Boolean к Number ради краткой записи. users[0].friends[0].gender
friends
(массив). Был объект user
, стал только его массив friends
. Методом map()
friends
методом filter()
надо оставить только тех, где gender === 'female'
users
получится массив массивов – иногда пустых, иногда с девушками.flat()
map(fn).flat()
заменить на один, делающий то же самое, flatMap(fn)
users.flatMap(({ friends }) => friends.filter(({ gender }) => gender === 'female'));
// [ {"name":"Mira","gender":"female"}, {"name":"Aria","gender":"female"}, {"name":"Keit","gender":"female"} ]
function countContiguousDistinct(k, arr) {
let cardinality = 0;
for (let i = 0; i < k; i++) {
if (i === arr.indexOf(arr[i])) cardinality++;
}
const result = [cardinality];
const isNotInWindow = (value, arr, start, finish) => {
for (let j = start; j < finish; j++) {
if (arr[j] === value) return false;
}
return true;
}
for (let i = 0; i < arr.length - k; i++) {
const L = arr[i];
const R = arr[i + k];
if (L !== R) {
if (isNotInWindow(L, arr, i + 1, i + k)) cardinality--;
if (isNotInWindow(R, arr, i + 1, i + k)) cardinality++;
}
result.push(cardinality);
}
return result;
}
const htmlString = `<table>
<tr><td>Apple</td><td>12</td></tr>
<tr><td>Banana</td><td>34</td></tr>
</table>`;
const tmpl = document.createElement('template');
tmpl.innerHTML = htmlString;
const df = tmpl.content;
const rows = df.querySelectorAll('tr');
const result = [];
rows.forEach(row => {
result.push([...row.children].map(td => td.textContent));
});
result // [["Apple","12"],["Banana","34"]]
<div>
<p>Text</p>
<ul>
<li>Apple</li>
<li>Banana</li>
</ul>
</div>
И примерно такой код:const tmpl = document.createElement('template');
tmpl.innerHTML = msg; // строка с HTML
const df = tmpl.content; // DocumentFragment
df.children // массив из одного элемента: наружний div
df.children[0].children // массив с двумя эл.: параграфом и списком
df.children[0].children[1].children[1].textContent // "Banana"
[
['text', 'lorem ipsum dolor'],
['copy', 1],
['text', 'sit amet'],
['copy', 2],
]
если я правильно понял, что каждый из плейсхолдеров копирует значение после вертикальной черты – первый копирует 1, второй 2.<template v-for="item in items">
<component :is="text" v-if="item[0] === 'text'">{ item[1] }</component>
<component :is="copy" v-if="item[0] === 'copy'" :value="item[1]" />
</template>
index
deleteEl()
index
уже указывает на следующий элемент и не отрисовывает его.forEach()
render()
не место для изменения данных. Пусть каждый занимается своим делом: render()
только рисует что есть. delete() только удаляет элемент из массива (и вызывает render()
) $('.table_body').on('change', '.input_ptp_tema', function() {
change
добавьте проверку на число выбранных файлов:if (event.target.files.length !== 3) {
// как-то сообщить, что ждём именно 3 файла
return;
}
а когда всё ок, то либо сразу в разметке создать вместо 1 целых 3 тега с img, у каждого свой уникальный id. Либо генерить разметку трёх img на лету и заменять HTML у div.profile-images
function findWord() {
const text = document.getElementById('text_34').value;
const word = document.getElementById('word_34').value;
const outputElement = document.getElementById('output_34');
const re = new RegExp(word, 'gi'); // в word хорошо бы экранировать спец-символы RegExp'ов
function wrapInSpan(match) {
return '<span>' + match + '</span>';
}
outputElement.innerHTML = text.replace(re, wrapInSpan);
}
value
текстового поля ввода это просто строка текста, что бы там ни вводили.const str = '1,2, 3, 4'; // то, что забрали из value инпута
const separator = /,\s*/; // рег. выражение: запятая и потом 0 или больше пробелов
const arr = str.split(separator); // [ "1", "2", "3", "4" ]
тут ешё один подвох: элементы массива по-прежнему строки. Не число 1, а строка "1".const arr = str
.split(separator)
.map(Number); // [ 1, 2, 3, 4 ]
вот теперь больше похоже на желаемый, наверное, результат? const a = {};
const b = {};
a.b = b;
b.a = a;
cloneDeep(a); // бесконечный цикл
/Applications/Visual Studio Code.app/Contents/Resources/app/out/vs/workbench/contrib/terminal/browser/media/shellIntegration-bash.sh
в строке 125-r
на -E
-r
, он только на Linux)- __vsc_current_command="$(builtin history 1 | sed -r 's/ *[0-9]+ +//')"
+ __vsc_current_command="$(builtin history 1 | sed -E 's/ *[0-9]+ +//')"
DB::raw()
$revCount = ReviewUserCount::updateOrCreate(
['user_id' => $user->id, 'review_id' => $request->reviews], //здесь нахожу нужную строку
['count' => DB::raw('count + 1')]
);
ReviewUserCount::upsert(
['user_id' => $user->id, 'review_id' => $request->reviews, 'count' => 1],
['user_id', 'review_id'],
['count' => DB::raw('count + 1')]
);
но что он возвращает – надо уточнять. ffmpeg \
-ss 15 \
-i input.mp4 \
-t 75 \
-c copy \
output_15_90.mp4
пропустить 15 секунд от начала, взять фрагмент длиной 75 сек, сохранить без перекодирования в файл output_15_90.mp4ffmpeg \
-ss 15 \
-i input.mp4 \
-vf scale=854:-2 \
-t 75 \
-c:v libx264 \
-c:a aac \
output_15_90.mp4
сделать ширину кадра 854 точки, высоту пропорционально но кратно 2 (требование кодека), видео сжать софтверным h264, аудио кодеком AAC.libx264
— h264_videotoolbox