Выходной объект с тем же значением в той же позиции - PullRequest
1 голос
/ 20 марта 2019

Найдите function ranking(people), который принял массив объектов в качестве входных данных.Keys: Name и Points.Он должен вернуть отсортированный массив с самыми высокими точками в первой позиции, 2-й самой высокой во второй ... Он должен содержать клавишу third: Position.Пока все хорошо.

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

Пример:

ranking([{name: "John",points: 100},{ name: "Bob",points: 130},{name: "Mary", points: 120},{name: "Kate",points: 120}]);

Поскольку Боб занимает самое высокое место, эти объекты должны быть возвращены в первую очередь.Мэри и Кейт занимают второе место.Так что оба должны быть расположены в позиции: 2.

Это часть, с которой я борюсь.Мой код до сих пор (кроме проблемной части, которую я поставил отдельно)

function ranking(people) {
  people.sort((a, b) => (a.points > b.points ? -1 : 1));
  for (var i = 0; i < people.length; i++) {
    Object.assign(people[i], { position: i + 1 });
  }
  console.log(people);
}

Я попытался сравнить клавиши точек в цикле for, как

if(people[i].points === people[i+1].points) {
people[i+1].position === i;
}

который не работает.Я думаю, что мне нужно использовать map или for…in, но я не знаю, как ...

РЕДАКТИРОВАТЬ:

Вывод должен быть:

name: "Bob", points: 130, position: 1
name: "Kate", points: 120, position: 2
name: "Mary", points: 120, position: 2
name: "John", points: 100, position: 3 **NOT 4** 

После прочтения некоторых подсказок, которые я придумал:

   for (var j = 1; j < people.length; j++) {
     if (people[j - 1].points === people[j].points) {
       people[j].position = j;
     }
   }

Но в чем проблема, что нет позиции 3 - просто position: 4

Ответы [ 2 ]

1 голос
/ 20 марта 2019

var data = [{name: "John",points: 100},{ name: "Bob",points: 130},{name: "Mary", points: 120},{name: "Kate",points: 120}];

//Sorts the object array by the points key
data.sort( (currentItem, nextItem) => {
    return currentItem.points > nextItem.points ? -1 : 1;
});

//add in those positions by comparing each item to the one before
data.forEach( (item, index) => {

    item.position = index+1;
    if( 0 === index ){
        return;
    }
    
    let previousItem = data[index-1];
    item.position = previousItem.points === item.points ? previousItem.position : previousItem.position+1;
});


data.forEach( i => {
 console.log(i);
});
0 голосов
/ 20 марта 2019

Сохраняйте два индекса во время итерации:

people.sort((a, b) => (a.points > b.points ? -1 : 1));

let position = 1;
for (var i = 0; i < people.length; i++) {
  Object.assign(people[i], { position });
  if(!i || people[i - 1].points > people[i].points) 
    position += 1;
}

return people;

Или, если вам нужен oneliner:

people
  .sort((a, b) => a.points - b.points)
  .reduce((prev, curr) => (curr.position = prev.position + (curr.points < prev.points), curr), { position: 0, points: -Infinity });

return people;
...