Перекладывание бумажек

Всем привет!
Вот, что получилось:

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;
}
2 лайка

Классная фича языка. Вопрос: использование ее не будет считаться усложнением кода, если например иногда использовать где это логично? Вопрос с точки зрения поддержки кода как чужого так и своего спустя время

ну побитовые операторы используются абсолютно в конкретных случаях, в частности побитовое НЕ используется вкупе с 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++;
    }
  }
1 лайк

Почему-то не пользуются “успехом” варианты с RegExp-ами. В качестве “пробного шара”…

var getDocumentsNumbers = function (docList, year) {
var pattern = year + ‘$’;
var accum = 0;

for (var i = 0; i < docList.length; i++) {
if (docList[i].search (pattern) != -1) {accum++;}
}
return accum;
}

2 лайка

Не стала использовать 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);

if (findYear==year) {total++}
}
return total;
};

2 лайка

можно было чуть упростить через остаток от деления, типа
findYear = docs[i] % 10000;
заодно и к числу приводить не надо (арифметика сама это сделает) и округления излишни (минус 7 строк кода).

О, точно) программа стала короче

var getDocumentsNumbers = function (docs, year) {
var findYear = 0;
total = 0;

for (var i = 0; i <= docs.length-1; i++) {
findYear = parseInt(docs[i], 10);
findYear = docs[i] % 10000;
if (findYear==year) {total++}
}
return total;
};

parseInt тоже не надо =)

коротулечка
function getDocumentsNumbers(docs, year) {
  let total = 0;
  for (let i = 0; i < docs.length; i++) {
    if (docs[i] % 10000 == year) { total++; }
  }
  return total;
}
6 лайков
const getDocumentsNumbers = (data, year) => 
  data.reduce((acc, e) => Number(e.slice(-4)) === year ? acc + 1 : acc, 0);
3 лайка

if (year > -1) для тупых, почему -1 ?

1 лайк

indexOf() возвращает индекс подстроки, если не находит возвращает -1

1 лайк
Используя современные средства - smth just like this)
const getDocumentsNumbers = (arr, year) => {
  const lastTwoNumbersOfYear = year.toString().substring(year.toString().length - 2);
  let smallArr = arr.map(item => item.substring(item.length - 2));
  return smallArr.filter(item => item === lastTwoNumbersOfYear).length;
};

может чуть позже через reduce решу) -
будет похоже - только смысл, что через массив одиножды проходимся)

Тогда уже вот так, в одну строку

const getDocumentsNumbers = (arr, year) => arr.filter(item => item.substring(item.length - 4) === year.toString()).length;

норм, но -4 магическое число

if (arr[i].indexOf(year, 4) !== -1) {
Объясните пожалуйста, почему стоит не просто (year) , a (year, 4). Что это за 4 и что она дает?

когда непонятно как работает какой-то метод, читайте документацию
второй аргумент - это индекс, с которого начинать поиск (по-умолчанию 0 и его опускают)

Редьюс с выносом регулярного выражения:

const getDocumentsNumbers = (data, year) => {
const re = new RegExp(year + ‘$’, ‘gi’);
return data.reduce((acc, item) => item.match(re) ? acc + 1 : acc, 0);
};

var getDocumentsNumbers = function(date, year) {
  var quantityYears = 0;
  for (var i=0; i<=date.length-1; i++) {
    date[i] = parseInt(date[i].slice(-4), 10);
    if (date[i] === year) {
      quantityYears++;
    }
  } return quantityYears;
}