Javascript: как отсортировать массив по частоте появления? - PullRequest
0 голосов
/ 24 сентября 2019

У меня есть такой массив:

people = [
{id:1,name:'abc',age:18},
{id:2,name:'abcd',age:20},
{id:3,name:'abce',age:18},
{id:4,name:'abcf',age:18},
{id:5,name:'abcg',age:21},
{id:6,name:'abch',age:20},
{id:7,name:'abci',age:17},
]

Теперь я хочу отсортировать порядок массивов по частоте встречаемости (возрасту) в javascript.Вывод как это:

people = [
{id:1,name:'abc',age:18},
{id:3,name:'abce',age:18},
{id:4,name:'abcf',age:18},
{id:2,name:'abcd',age:20},
{id:6,name:'abch',age:20},
{id:5,name:'abcg',age:21},
{id:7,name:'abci',age:17},
]

Так как я могу это сделать?

Спасибо всем.Я пытался следовать ответу Нины Шольц, но у меня такая ошибка.

   var people = [{ id: 1, name: 'abc', age: 18 }, { id: 2, name: 'abcd', age: 20 }, { id: 3, name: 'abce', age: 18 }, { id: 4, name: 'abcf', age: 18 }, { id: 5, name: 'abcg', age: 21 }, { id: 6, name: 'abch', age: 20 }, { id: 7, name: 'abcg', age: 21 }, { id: 8, name: 'abci', age: 17 }],
                    count = people.reduce((r, { age }) => (r[age] = (r[age] || 0) + 1, r), {});

                people.sort((a, b) => count[b.age] - count[a.age]);

                console.log(people);

Вывод:

people = [
{id:1,name:'abc',age:18},
{id:3,name:'abce',age:18},
{id:4,name:'abcf',age:18},
{id:2,name:'abcd',age:20},
{id:5,name:'abcg',age:21},
{id:6,name:'abch',age:20},
{id:5,name:'abcg',age:21},
{id:7,name:'abci',age:17},
]

Я решил это.Изменить функцию сортировки на

 people.sort((a, b) => {
                    if (count[b.age] === count[a.age]) {
                        if (b.age < a.age) {
                            return -1;
                        }
                        if (b.age > a.age) {
                            return 1;
                        }
                        return 0;
                    } else if (count[b.age] < count[a.age]) {
                        return -1;
                    }
                });

Ответы [ 3 ]

4 голосов
/ 24 сентября 2019

Просто посчитайте возраст и сортируйте по убыванию.

var people = [{ id: 1, name: 'abc', age: 18 }, { id: 2, name: 'abcd', age: 20 }, { id: 3, name: 'abce', age: 18 }, { id: 4, name: 'abcf', age: 18 }, { id: 5, name: 'abcg', age: 21 }, { id: 6, name: 'abch', age: 20 }, { id: 7, name: 'abci', age: 17 }],
    count = people.reduce((r, { age }) => (r[age] = (r[age] || 0) + 1, r), {});

people.sort((a, b) => count[b.age] - count[a.age]);

console.log(people);
.as-console-wrapper { max-height: 100% !important; top: 0; }

Для сортировки по count и age добавьте логическое ИЛИ || вместе сдельта веков.

   var people = [{ id: 1, name: 'abc', age: 18 }, { id: 2, name: 'abcd', age: 20 }, { id: 3, name: 'abce', age: 18 }, { id: 4, name: 'abcf', age: 18 }, { id: 5, name: 'abcg', age: 21 }, { id: 6, name: 'abch', age: 20 }, { id: 7, name: 'abcg', age: 21 }, { id: 8, name: 'abci', age: 17 }],
    count = people.reduce((r, { age }) => (r[age] = (r[age] || 0) + 1, r), {});

people.sort((a, b) =>
    count[b.age] - count[a.age] ||
    b.age - a.age
);

console.log(people);
.as-console-wrapper { max-height: 100% !important; top: 0; }
1 голос
/ 24 сентября 2019

Попробуйте это:

let people = [{ id: 1, name: 'abc', age: 18 }, { id: 2, name: 'abcd', age: 20 }, { id: 3, name: 'abce', age: 18 }, { id: 4, name: 'abcf', age: 18 }, { id: 5, name: 'abcg', age: 21 }, { id: 6, name: 'abch', age: 20 }, { id: 7, name: 'abci', age: 17 }];
let tmpAge = {};
for (let i = 0; i < people.length; i++) {
  if (!tmpAge[people[i].age]) {
    tmpAge[people[i].age] = 1;
  } else {
    tmpAge[people[i].age]++;
  }
}
people.sort((a, b) => tmpAge[b.age] - tmpAge[a.age]);
console.log(people);
0 голосов
/ 24 сентября 2019
const people = [
  { id: 1, name: 'abc', age: 18 },
  { id: 2, name: 'abcd', age: 20 },
  { id: 3, name: 'abce', age: 18 },
  { id: 4, name: 'abcf', age: 18 },
  { id: 5, name: 'abcg', age: 21 },
  { id: 6, name: 'abch', age: 20 },
  { id: 7, name: 'abci', age: 17 },
];

const agesFrequency = people.reduce((previousValue, currentValue) => {
  const { age } = currentValue;

  return {
    ...previousValue,
    [age]: (
      previousValue[age] || 0
    ) + 1,
  };
}, {});

people.sort((
  (a, b) =>
    agesFrequency[b.age] - agesFrequency[a.age]
));

console.log(people);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...