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

зачем юзать те фичи, которые люди, проходившие только тренажёр, знать не могут ? :face_with_monocle:

разве меня что то ограничивает залезть на MDN JS и найти подходящие функции для решения задачи? ну нет же обязательства только из тренажера черпать инфу. Может кому будет интересно сравнить свой код написанный на основе знаний полученных на курсе с моим. На момент написания этого кода я впервые познакомился с данными функциями и достаточно много времени потратил на задачу учитывая доп. изучение. :upside_down_face:

1 лайк

Через slice

function getDocumentsNumbers (document, year) {
let summDocument = 0;
for (i = 0; i < document.length; i++) {
if (year == document[i].slice(4)) {
summDocument++
}
}
return summDocument
}

Решение без использования indexOf и других вспомогательных функций (включая Number).
Мое решение построено на том, что каждый ‘строчный’ (типа string) элемент массива сам является массивом последовательно представленных символов, на который распространяются все правила работы с массивом. Например: ‘пример’ - это массив [‘п’, ‘р’, ‘и’, ‘м’, ‘е’, ‘р’].

Сам код с комментариями:

let getDocumentsNumbers = function (names, year) {
  let counter = 0; //счетчик
  for (let i = 0; i < names.length; i++) {
    let yearNum = ''; //строка, в которую записываются символы из имени документа
    
    for (let j = 4; j < names[i].length; j++) {
      yearNum += names[i][j]; //добавляем символы из имени с 5го по 8
    }
    
    if (yearNum == year) //сравниваем с приведением полученную строку и искомый год
    {
      counter ++; //если значения равны, плюсуем счетчик
    }
    
  }
  
  return counter;
}
2 лайка

let getDocumentsNumbers = function (documentNames, year) {
let count = 0;
for (let i = 0; i < documentNames.length; i++) {
if (documentNames[i].lastIndexOf(year) !== -1 && documentNames[i].lastIndexOf(year) === 4) {
count++
}
}
return count;
}

Сперва пытался решить через перевод содержимого i того значения в String и далее в строчном элементе искать год начиная с 4 индекса строчного элемента, но время было позднее а с первого раза у меня не вышло. Тут я вспомнил про indexOf (x, y ) и решение родилось мгновенно:

let counter = 0;

let getDocumentsNumbers = function (arr, year) {

for (let i=0; i<=arr.length-1; i++) {
if (arr[i].indexOf(year,4)>=0) {counter++}
}
return counter
}

Все работает, но таких записей “names[i] [j]” мы точно не проходили, как они работают?

в задании сказано, что

Даты из массива записаны в виде строк.

То есть любой элемент массива будет строкой типа ‘ДДММГГГГ’ - нас интересуют последние 4 символа ГГГГ. Так вот строка ‘ДДММГГГГ’ - это тоже массив из 8 символов, у каждого из которых есть порядковый номер. Тогда сам массив с именами документов - это массив массивов вида

[ [ … ], [ … ], …, [ … ] ].

Можно взять любой его элемент по номеру array[ i ] - это тоже массив, и обратиться к любому из его элементов через (array[ i ])[ j ] или array[ i ][ j ]. Как то так:
image

1 лайк

Благодарю за развернутый ответ.

Мой вариант без indexOf()

Код
let getDocumentsNumbers = function(nameArr, year) {
  let flag = 0;
  for(let i = 0; i < nameArr.length; i++) {
    let stringToNumber = Number(nameArr[i]);
    let checkYears = 0;
    checkYears = stringToNumber % 10000;
    if(checkYears === year) {
      flag++;
    } 
  }
  return flag;
}
let nameArr = [];
getDocumentsNumbers();

Ничего лишнего. Без индексофов. Коротко и работает:

let getDocumentsNumbers = function (array, year) {
  sum = 0;
  
  for (let i = 0; i <= array.length - 1; i++) {
    if(array[i] % 10000 === year) {
      sum++;
    }
  }
  return sum;
}
3 лайка
let getDocumentsNumbers = function (documents, year) {
  return documents.filter(document => document.lastIndexOf(year) > 3).length
}

Здравствуйте, кто может разъяснить зачем нужен “+1” в конце строки и почему без него не работает?

рабочий код, проходит проверку.
let getDocumentsNumbers = function(
arrayOfDocuments, year){
let count = 0;
for(let i = 0; i < arrayOfDocuments.length; i++){
if(arrayOfDocuments[i].indexOf(year, 4) === 4){
count ++;
}
}
return count;
};

let getDocumentsNumbers = function (array, year) {
  let docsNumber = 0;
  for (let i = 0; i < array.length; i++) {
    let s = array[i]
    if (Number(s[4] + s[5] + s[6] + s[7]) === year) {
      docsNumber++;
    }
  }
  return docsNumber;
}
1 лайк

var getDocumentsNumbers = function(documentsName, year) {
var quantityDocuments = 0;
for(var i = 0; i<documentsName.length; i++) {
if(documentsName[i].indexOf(String(year),4) > 0) {
quantityDocuments++;
}
}
return quantityDocuments;
}

Вариант с IndexOf

Сводка
let getDocumentsNumbers = function (arrDocument, year){
  
  let countDocument = 0;
  
  for(let i = 0; i < arrDocument.length; i++){
    let item = arrDocument[i];
    if(item.indexOf(String(year), 4) !== -1){
      countDocument ++;
    }
  }
  return countDocument;
}

Альтернативный подход. P.S. (код курильщика)

let getDocumentsNumbers = function (arrDocument, year){
  
  let countDocument = 0;
  let yearLength = String(year).length;
  
  for(let i = 0; i < arrDocument.length; i++){
    let arrItemYear = '';
    let currentItem = arrDocument[i];
      for(let j = yearLength; j > 0; j--){
        arrItemYear += currentItem[currentItem.length - j]
    }
    if(Number(arrItemYear) == Number(year)){
      countDocument++;
    }
  }
  
  return countDocument;
}

Решение без IndexOf и иных методов. На чистых циклах
P.S. С IndexOf 'это становиться уж слишком просто :wink:

let getDocumentsNumbers = function (documents, year) {
let amount = 0;
year = String(year);
for (let i = 0; i < documents.length; i++) {
let word = String(documents[i]);
for (let j = 4, k = 0, coincidence = 0; j < word.length; j++) {
if (word[j] === year[k]) {
coincidence++;
k++
}
if (coincidence === 4) {
amount++;
}
}
}
return amount;
}

Как думаешь почему не пользуються усехом?
МОЖЕТ ПОТОМУ ЧТО НИКТО ТУТ НЕ ЗНАЕТ ОБ ЭТОМ?
Потому что курс для новичков?!

let getDocumentsNumbers = function(nameDoc, year) {
  let numberDoc = 0;
  year = String(year);
  
  for (let i = 0; i < nameDoc.length; i++) {
      if(nameDoc[i].indexOf(year, 4) !== -1) {
        numberDoc++;
      };  
  };
  
  return numberDoc;
  };