var getDocumentsNumbers = function (docNames, year) {
var docNumbers = 0;
for (var i = 0; i < docNames.length; i++) {
var names = docNames[i]
if (names.indexOf(year, 4) + 1) {
docNumbers++;
}
}
return docNumbers
};
для памяти: алярма, неочевидное использование языка. if (~str.indexOf(substr, order)) {…} можно перефразировать как “если найдена подстрока такая-то”, то…
использование тильды (побитовый оператор “НЕ”) элегантно, т.к. её можно описать как -(N + 1) , где N - наше исходное выражение ( ~N === -(N + 1) ). При значениях “не найдено”, т.е. когда indexOf выдаст -1, мы получим -0, который распознается в if как false и соответственно не даст выполниться телу условия. таким образом в счетчик попадают лишь соответствующие поиску подстроки.
Собственно решение
function getDocumentsNumbers(array, year) {
let quantity = 0;
for (let i = 0; i < array.length; i++) {
if (~array[i].indexOf(year, 4)) { quantity++; }
}
return quantity;
}
Классная фича языка. Вопрос: использование ее не будет считаться усложнением кода, если например иногда использовать где это логично? Вопрос с точки зрения поддержки кода как чужого так и своего спустя время
ну побитовые операторы используются абсолютно в конкретных случаях, в частности побитовое НЕ используется вкупе с indexOf (т.к. в случае ненахождения, он отдает -1, это важно). потому что чтение такой кракозябры неопытными (да что там, даже некоторыми джунами) бывает затруднительно.
еще как пример - инвертирование регистра (из UPPERCASE в lowercase) с помощью XOR. Чтобы инвертировать “ПрИфФкИ, каГ дЕлиФФкИ?” в “пРиФфКи, КАг ДеЛИффКи?” (применяется в шифровании, например)
var getDocumentsNumbers = function (array, year) {
var finalAmount = 0;
for (var i = 0; i < array.length; i++) {
if (nameDoc[i].slice(4).includes(year))) {
finalAmount++;
}
}
Не стала использовать indexOf(), пошла окольным путём
var getDocumentsNumbers = function (docs, year) {
var findYear = 0;
var round = 0;
total = 0;
for (var i = 0; i <= docs.length-1; i++) {
//переводим дату из строки в число, получаем из него год
findYear = parseInt(docs[i], 10);
findYear /= 10000;
round = Math.round(findYear);
findYear = Math.round((findYear - round)*10000);
можно было чуть упростить через остаток от деления, типа
findYear = docs[i] % 10000;
заодно и к числу приводить не надо (арифметика сама это сделает) и округления излишни (минус 7 строк кода).
function getDocumentsNumbers(docs, year) {
let total = 0;
for (let i = 0; i < docs.length; i++) {
if (docs[i] % 10000 == year) { total++; }
}
return total;
}
когда непонятно как работает какой-то метод, читайте документацию
второй аргумент - это индекс, с которого начинать поиск (по-умолчанию 0 и его опускают)