Задать вопрос

Как перебрать такой массив?

["груша", "яблоко", "апельсин", "груша", "банан", "груша", "апельсин"]


Необходимо сравнить элементы данного массива на соответствие и вывести список соответствий от большего к меньшему.
Т.е примерно так:
груша - 3
апельсин - 2
яблоко - 1
банан - 1
Думал проверять каждую букву каждого элемента и в случае совпадения выносить в отдельный массив, а из исходного удалять, и так с каждым элементом. Но такой код при масштабах вероятнее всего будет долго отрабатывать, какие еще есть варианты?
  • Вопрос задан
  • 213 просмотров
Подписаться 1 Оценить Комментировать
Решения вопроса 2
sergiks
@sergiks Куратор тега JavaScript
♬♬
Создайте объект с ключами-словами, где значения будут частотой нахождения.
var src = ["груша", "яблоко", "апельсин", "груша", "банан", "груша", "апельсин"];
var dict = src.reduce( function(p,c){
  if( p.hasOwnProperty(c)) p[c]++;
  else p[c] = 1;
  return p;
}, {});

// теперь нужно вывести dict в порядке убывания значений:
// создать массив объектов с двумя полями: слово и число
// и отсортировать его по убыванию поля с числом.
var arr = [], word;
for( word in dict) arr.push({ w: word, n: dict[word] });
arr.sort( function(a,b){ return b.n - a.n });

// массив arr теперь отсортирован правильно, осталось вывести:
for( var i = 0; i < arr.length; i++) console.log( arr[i].w +' - '+ arr[i].n );
Ответ написан
@Ridz
как вариант ...
function foo(d) {
    var b = {};
    return d.filter(function(a, c, d) {
        if (b[a]) return !1;
        for (b[a] = 1; ~(c = d.indexOf(a, ++c));) b[a]++;
        return !0
    }).sort(function(a, c) {
        return b[c] - b[a]
    }).map(function(a) {
    return a += " - " + b[a]
})
};
var src = ["груша", "яблоко", "апельсин", "груша", "банан", "груша", "апельсин"];
alert(foo(src).join("\n"));
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
То что вам нужно называется Reduce.
var result = array.reduce((previous, current) => {
    if (previous.hasOwnProperty(current)) {
         previous[current]++;
    } else {
         previous[current] = 1;
    }
    return previous;
}, {});

На выходе получится как раз то, о чем говорил Сергей Соколов
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
Rocket Смоленск
от 80 000 до 130 000 ₽
div. Ставрополь
от 40 000 до 90 000 ₽
Wanted. Санкт-Петербург
До 220 000 ₽
18 дек. 2024, в 14:45
25000 руб./за проект
18 дек. 2024, в 14:43
25000 руб./за проект
18 дек. 2024, в 14:22
750 руб./за проект