Заменить значение в массиве после сортировки - PullRequest
0 голосов
/ 17 января 2019

Я сортирую данные JSON в правильном порядке, однако я хотел бы заменить значение позиции.

Мои данные JSON:


    {
      "dev@be-activ-it.fr-Quiz-10": {
        "id": "dev@be-activ-it.fr-Quiz-10",
        "user_id": "dev@be-activ-it.fr",
        "myposition": 1,
        "points": 35
      },
      "fbl@be-activ-it.fr-Quiz-10": {
        "id": "fbl@be-activ-it.fr-Quiz-10",
        "user_id": "fbl@be-activ-it.fr",
        "myposition": 2,
        "points": 38
      },
      "ddd@be-activ-it.fr-Quiz-10": {
        "id": "ddd@be-activ-it.fr-Quiz-10",
        "user_id": "ddd@be-activ-it.fr",
        "myposition": 3,
        "points": 37
      }
    }

Что я хочу:


    {
      "fbl@be-activ-it.fr-Quiz-10": {
        "id": "fbl@be-activ-it.fr-Quiz-10",
        "user_id": "fbl@be-activ-it.fr",
        "myposition": 1,
        "points": 38
      },
      "ddd@be-activ-it.fr-Quiz-10": {
        "id": "ddd@be-activ-it.fr-Quiz-10",
        "user_id": "ddd@be-activ-it.fr",
        "myposition": 2,
        "points": 37
      },
      "dev@be-activ-it.fr-Quiz-10": {
        "id": "dev@be-activ-it.fr-Quiz-10",
        "user_id": "dev@be-activ-it.fr",
        "myposition": 3,
        "points": 35
      }
    }

Мой код:

let data = fs.readFileSync('course.json/rank.json', 'utf8');
    data = JSON.parse(data);

    const comparePoints = (a,b)=>{

      let a_points = a["points"]
      let b_points = b["points"]

      return b_points-a_points
    }

    const sort = (data) => {
    let keys = Object.keys(data)
    let dataAsArray = keys.map(e=>data[e])
    return dataAsArray.sort(comparePoints)
    }

    data = sort(data);
    console.log(data);

Что я получаю:


    [ { "id": "fbl@be-activ-it.fr-Quiz-10",
        "user_id": "fbl@be-activ-it.fr",
        "myposition": 2,
        "points": 38 },
      { "id": "ddd@be-activ-it.fr-Quiz-10",
        "user_id": "ddd@be-activ-it.fr",
        "myposition": 3,
        "points": 37 },
      { "id": "dev@be-activ-it.fr-Quiz-10",
        "user_id": "dev@be-activ-it.fr",
        "myposition": 1,
        "points": 35 } ]

Я хотел бы поменяться местами, вы можете мне помочь? ТНХ

Ответы [ 3 ]

0 голосов
/ 17 января 2019

используйте значения объекта для извлечения значений объекта, сортируйте их, затем используйте уменьшите для восстановления объекта:

const json = {
  "dev@be-activ-it.fr-Quiz-10": {
    "id": "dev@be-activ-it.fr-Quiz-10",
    "user_id": "dev@be-activ-it.fr",
    "myposition": 2,
    "points": 35
  },
  "fbl@be-activ-it.fr-Quiz-10": {
    "id": "fbl@be-activ-it.fr-Quiz-10",
    "user_id": "fbl@be-activ-it.fr",
    "myposition": 1,
    "points": 38
  },
  "ddd@be-activ-it.fr-Quiz-10": {
    "id": "ddd@be-activ-it.fr-Quiz-10",
    "user_id": "ddd@be-activ-it.fr",
    "myposition": 3,
    "points": 37
  }
};

const result = Object.values(json).sort((a, b) => a.myposition - b.myposition).reduce((all, curr) => {
  all[curr.id] = curr;
  return all;
}, {});

console.log(result);
0 голосов
/ 17 января 2019
const comparePoints = (a,b)=>{

  let a_points = a["points"]
  let b_points = b["points"]

  return a_points-b_points
}

Вместо б-а попробуйте а-б. Визит: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort

0 голосов
/ 17 января 2019

в основном с вашим кодом вы Array не являетесь другим объектом, поэтому вам нужно воссоздать объект из вашего отсортированного массива. Это может быть сделано с помощью функции Reduce для каждой или любой функции зацикливания. Я думаю, что сокращение легче увидеть.

здесь вы используете what you get и возвращаете what you want

const yourResult = [
  {
    "id": "fbl@be-activ-it.fr-Quiz-10",
    "user_id": "fbl@be-activ-it.fr",
    "myposition": 2,
    "points": 38
  },
  {
    "id": "ddd@be-activ-it.fr-Quiz-10",
    "user_id": "ddd@be-activ-it.fr",
    "myposition": 3,
    "points": 37
  },
  {
    "id": "dev@be-activ-it.fr-Quiz-10",
    "user_id": "dev@be-activ-it.fr",
    "myposition": 1,
    "points": 35
  }
]

const whatYouWant = yourResult.reduce((a, c, i) => {
  c['myposition'] = i + 1;
  a[c.id] = c;
  return a;
}, {})

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