Объясните что делает данный код?

94
02 января 2021, 14:50

Изучаю создание подсчета количества слов в тексте и не совсем понимаю принцип работы следующего кода. Пожалуйста, объясните. Не понимаю для чего используется здесь двойной массив:

if (arr[arr[i]]) {
arr[arr[i]] += 1;
arr.splice(i, 1);
} else {
arr[arr[i]] = 1;

Не понимаю, принцип работы метода sort именно здесь:

arr.sort(function(a, b) {
return arr[b] - arr[a];
});

И не понимаю совсем для чего используется вот этот вот кусок, понимаю только, что мы создаём JSON, но для чего он нужен и что за переменные в нём используются - не понимаю:

var stringResult = JSON.stringify(arr, function(k, v) {
if (k == '') return v;
return `${v} - ${arr[v]}`;
}, 2);

var arr = ('Привет, как твои дела? Привет, нормально, а как твои?').toLowerCase().replace(/[.,\/#!?$%\^&\*;:{}=\-_`~()]/g, "").split(' '); 
 
for (var len = arr.length, i = len; --i >= 0;) { 
  if (arr[arr[i]]) { 
    arr[arr[i]] += 1; 
    arr.splice(i, 1); 
  } else { 
    arr[arr[i]] = 1; 
  } 
} 
arr.sort(function(a, b) { 
  return arr[b] - arr[a]; 
}); 
 
console.log(arr); 
var stringResult = JSON.stringify(arr, function(k, v) { 
  if (k == '') return v; 
  return `${v} - ${arr[v]}`; 
}, 2); 
console.log(stringResult);

Answer 1

В данном случае используется возможность, позволяющая хранить в массиве не числовые ключи.

Благодаря ей можно подсчитывать количество повторений слов без дополнительных переменных.

arr[i] - возвращает конкретное слово
arr[arr[i]] - позволяет обратиться к свойству массива с именем соответствующим значению arr[i].

Так если arr[i] == "Привет", то arr[arr[i]] -> arr["Привет"].

Внутри цикла:

for (var len = arr.length, i = len; --i >= 0;) {
  if (arr[arr[i]]) { // если слово уже встречалось
    arr[arr[i]] += 1; // увеличиваем счетчик
    arr.splice(i, 1); // удаляем элемент массива
  } else { // иначе
    arr[arr[i]] = 1; // устанавливаем счетчик 
  }
}

происходит подсчет слов, и удаление повторных вхождений слов.

Далее происходит сортировка массива на основе количества повторений слов

arr.sort(function(a, b) {
  // a,b здесь это слова `"Привет"` и т.д.  соответственно `arr[a]` - вернет количество повторений слова.
  return arr[b] - arr[a];
});

Код с JSON.stringify нужен только для красивого вывода. За красивый вывод отвечает функция передаваемая в качестве параметра. Если ее не указывать выведется просто массив слов, в данном же случае дополнительно выводится количество повторений каждого слова.

var arr = ('Привет старушка, как дела? Дела у меня, хорошо меня. Привет старушка, как дела? Дела у меня, хорошо меня. Привет старушка, как дела? Дела у меня, хорошо меня.').toLowerCase().replace(/[.,\/#!?$%\^&\*;:{}=\-_`~()]/g, "").split(' '); 
 
for (var len = arr.length, i = len; --i >= 0;) { 
  if (arr[arr[i]]) { 
    arr[arr[i]] += 1; 
    arr.splice(i, 1); 
  } else { 
    arr[arr[i]] = 1; 
  } 
} 
arr.sort(function(a, b) { 
  return arr[b] - arr[a]; 
}); 
 
console.log(arr); 
var stringResult = JSON.stringify(arr, function(k, v) { 
  if (k == '') return v; 
  return `${v} - ${arr[v]}`; 
}, 2); 
console.log(stringResult);

READ ALSO
Как выполнять JS код в зависимости от id?

Как выполнять JS код в зависимости от id?

На одном сайте лежит файл loadjs

118
Возвратить частичное представление в ajax

Возвратить частичное представление в ajax

Не могу получить частичное представление из метода контроллера, в чем может причина

98
Скрытие контента в таблице

Скрытие контента в таблице

Всем привет есть таблицаКаждому блоку таблицы задан определенный процентный width который в сумме дает 100% для корректного отображения всего...

128
Конкатенация изображений в <canvas> [дубликат]

Конкатенация изображений в <canvas> [дубликат]

нужно сделать приложение для конкатенации изображений,которые берутся из 2 инпутов(в разметке должны быть только 2 инпута и канвас) и отображаются...

141