const getStrs = (arrs, len) => [
'*'.repeat(len + 2),
...arrs.flatMap(arr => arr
.reduce((acc, n) => {
let g = acc[acc.length - 1];
(g && (g[1] + n.length + !!g[0].length) <= len) || acc.push(g = [ [], 0 ]);
g[1] += n.length + !!g[0].length;
g[0].push(n);
return acc;
}, [])
.map((n, i, a) => `*${n[0].join(' ')[a.length > 1 ? 'padStart' : 'padEnd'](len, ' ')}*`)),
'*'.repeat(len + 2),
];
console.log(getStrs(textArray, 16));
.children(i)
$.each(res, function(i, n) {
this
.eq(i)
.html(`${n[1]}<input type="hidden" value="${n[0]}">`)
.css('display', 'block');
}.bind($('.box-results-search').children()));
{ key: первый индекс, где встречается key }
:const keyIndex = arr.reduce((acc, n, i) => (acc[n.key] ??= i, acc), {});
id
. Можно отсортировать существующий массив:arr.sort((a, b) => (keyIndex[a.key] - keyIndex[b.key]) || (a.id - b.id));
const sorted = (arr, keys) => arr
.map(n => [ n ].concat(keys(n)))
.sort((a, b) => {
let diff = 0;
for (let i = 0; ++i < a.length && !(diff = a[i] - b[i]);) ;
return diff;
})
.map(n => n[0]);
const sortedArr = sorted(arr, n => [ keyIndex[n.key], n.id ]);
const reverse = number => +[...`${Math.abs(number)}`].reverse().join('');
$grouped = [];
foreach ($arr as $brand => $items) {
foreach ($items as $item) {
$data = array_column(json_decode($item['data'], true)['cells'], 'data');
$model = array_shift($data);
if ($model) {
$grouped[$brand][$model][] = array_combine(
[ 'Year', 'Model', 'Bottom', 'Top' ],
$data
);
}
}
}
function getWinner(points) {
const [ a, b ] = points.reduce((acc, n) => (
n.split('-').forEach((m, i) => acc[i] += +m),
acc
), [ 0, 0 ]);
return a === b
? undefined
: a < b ? 2 : 1;
}
const getWinner = points => [ 2, , 1 ][Math.sign(eval(points.join('+'))) + 1];
const [ selected, setSelected ] = useState({});
const onChange = ({ target: { value, dataset: { id } } }) => {
setSelected({ ...selected, [id]: value });
};
return (
<div>
{data.map(({ id, name, variants }) => (
<div>
<div>{name}</div>
<select
value={selected[id]}
data-id={id}
onChange={onChange}
>
<option>ну давай, выбери что-нибудь</option>
{variants.map(n => <option value={n.price}>{n.data.period}</option>)}
</select>
<div>{selected[id] || 'НИЧЕГО НЕ ВЫБРАНО'}</div>
</div>
))}
</div>
);
pre
вместо div
)white-space: pre;
font-family: monospace;
JSON.stringify
, и почитайте. При чтении обратите внимание на то, что параметров у него больше одного. const buttonSelector = 'input[name="group"]';
const contentSelector = '.click';
const activeClass = 'show';
// делегирование, обработчик события добавляем один раз, на документ;
// соответствие между радиокнопками и блоками устанавливаем через равенство атрибутов
document.addEventListener('change', ({ target: t }) => {
if (t.matches(buttonSelector)) {
document.querySelectorAll(contentSelector).forEach(n => {
n.classList.toggle(activeClass, n.dataset.click === t.id);
});
}
});
// или, назначаем обработчик события каждой кнопке индивидуально;
// соответствие между радиокнопками и блоками устанавливаем через равенство индексов
const buttons = document.querySelectorAll(buttonSelector);
const contents = document.querySelectorAll(contentSelector);
buttons.forEach(n => n.addEventListener('change', onChange));
function onChange() {
const index = Array.prototype.indexOf.call(buttons, this);
contents.forEach((n, i) => n.classList.toggle(activeClass, i === index));
}
Object.values(data.reduce((acc, n) => {
(acc[n.code] ||= {
code: n.code,
name: n.name,
variants: [],
}).variants.push(n);
return acc;
}, {}))
function xxx(arr, val) {
let index = -1;
return () => val * arr[index = (index + 1) % arr.length];
}
const f = xxx([ 5, 6, 9 ], 2);
console.log([...Array(10)].map(f)) // [10, 12, 18, 10, 12, 18, 10, 12, 18, 10]
код до вложенной функции менять нельзя
function xxx(num) {
let a = 5;
let b = 6;
let c = 9;
return function() {
[ a, b, c ] = [ b, c, a ];
return num * c;
};
}
data: () => ({
info: null,
columns: [
{ title: 'title', key: 'title' },
{ title: 'old price', key: 'gsx$oldprice' },
{ title: 'new price', key: 'gsx$newprice' },
],
}),
mounted() {
axios
.get('https://spreadsheets.google.com/feeds/list/1iuJBDWtadHG4RHxUHhGcgdpmY_dffjLgWyRsf01mHAY/1/public/values?alt=json')
.then(r => this.info = r.data.feed.entry);
},
<table>
<thead>
<tr>
<th v-for="col in columns">{{ col.title }}</th>
</tr>
</thead>
<tbody>
<tr v-for="item in info">
<td v-for="col in columns">{{ item[col.key].$t }}</td>
</tr>
</tbody>
</table>
const itemSelector = 'селектор блока';
const buttonSelector = 'селектор кнопки';
$(document).on('click', buttonSelector, function() {
$(this)
.closest(itemSelector)
.prev()
.find(buttonSelector)
.prop('disabled', false);
});
// или
document.addEventListener('click', ({ target: t }) => {
const prev = t.matches(buttonSelector) && t
.closest(itemSelector)
.previousElementSibling
?.querySelector(buttonSelector);
if (prev) {
prev.disabled = false;
}
});
const getNestedProp = (data, key) => Object
.entries(data instanceof Object ? data : {})
.reduce((acc, [ k, v ]) => (
(k === key) && acc.push(v),
acc.push(...getNestedProp(v, key)),
acc
), []);
const ids = getNestedProp(data.flatMap(n => n.children), 'id');
function getNestedProp(data, key) {
const result = [];
for (const stack = [ data ]; stack.length;) {
const n = stack.pop();
if (n instanceof Object) {
if (n.hasOwnProperty(key)) {
result.push(n[key]);
}
stack.push(...Object.values(n).reverse());
}
}
return result;
}
// или
function getNestedProp(data, key) {
const result = [];
const stack = [];
for (let i = 0, arr = [ data ]; i < arr.length || stack.length; i++) {
if (i === arr.length) {
[ i, arr ] = stack.pop();
} else if (arr[i] instanceof Object) {
if (arr[i].hasOwnProperty(key)) {
result.push(arr[i][key]);
}
stack.push([ i, arr ]);
[ i, arr ] = [ -1, Object.values(arr[i]) ];
}
}
return result;
}
const createItem = obj => ({ key: `${obj.name}-${obj.id}`, title: obj.name });
const result = Object.values(columnList.reduce((acc, n) => {
(acc[n.table.id] ??= {
...createItem(n.table),
children: [],
}).children.push(createItem(n));
return acc;
}, {}));