acc[date] ??= { ... }
- это сокращение от acc[date] = acc[date] ?? { ... }
- если acc[date]
отсутствует, значит, будет создан. И, в любом случае, существовал ли acc[date]
раньше или был только что добавлен, он будет результатом выражения - так что можно сразу же обратиться к какому-нибудь из его свойств, в данном случае это объект documents
. С которым выполняются аналогичные действия - добавление вложенного объекта в случае отсутствия и обращение уже к его свойству (массив products
), с которым тоже что-то можно сделать (добавить элемент). Более традиционный вариант записи этого куска будет примерно таким:if (!acc[date]) {
acc[date] = {
date,
documents: {},
};
}
const documents = acc[date].documents;
if (!documents[n.docTypesName]) {
documents[n.docTypesName] = {
date: n.date,
docId: n.docId,
docTypesName: n.docTypesName,
products: [],
};
}
documents[n.docTypesName].products.push({
name: n.name,
price: n.price,
image: n.image,
qunatity: n.quantity,
});
b.findIndex(e => e === 0)
arr
.slice(0, (arr.indexOf(0) + 1) || arr.length)
.reduce((acc, n) => acc + n, 0)
Распишем данный массив как 1,A,V,2,3,11,C где , - это наш условный разделитель.
arr = '1,A,V,2,3,11,C'.split(',')
. В этом случае ошибке a.localeCompare is not a function
взяться неоткуда. a === '1' // true
? ' '.join(string[::-1][i:i + chunk_size] for i in range(0, len(string), chunk_size))[::-1]
'{:,}'.format(int(string)).replace(',', ' ')
даже проверить не удосужился