Изменение порядка элементов в javascript объекте в соответствии с заданным ключом - PullRequest
0 голосов
/ 19 февраля 2020

Я пытаюсь изменить порядок объектов в javascript по заданному ключу. Вот мой код для того же, но он говорит, что «сдвиг не функция». Разве это не применимо к объектам? Пожалуйста, дайте решение.

    periods = {
      "Su": 6,
      "Mo": 10,
      "Ma": 7,
      "Ra": 18,
      "Ju": 16,
      "Sa": 19,
      "Me": 17,
      "Ke": 7,
      "Ve": 20,
    };
    rotateOrder(key:any, entities:any) {
            let result = entities;
            for(var k in entities) {
              if(entities.hasOwnProperty(k) && k != key){
                result.push(result.shift());
              }
              else {
                return result;
              }
            }
          }
console.log(this.rotateOrder("Ve", this.periods));

Ответы [ 2 ]

1 голос
/ 09 марта 2020

Вы можете использовать Object.entries() для преобразования объекта в массив, затем используйте .slice() и .concat(), и, наконец, Object.fromEntries(), чтобы вернуть ваш объект.

В приведенном ниже примере я также использовали Object.keys() и .indexOf(), чтобы найти индекс key, но есть и другие решения.

let periods = {
  "Su": 6,
  "Mo": 10,
  "Ma": 7,
  "Ra": 18,
  "Ju": 16,
  "Sa": 19,
  "Me": 17,
  "Ke": 7,
  "Ve": 20,
};

function rotateOrder(key, obj) {
  let idx = Object.keys(obj).indexOf(key) // find the index of your key
  let arr = Object.entries(obj)  // this transform your object into an array

  let newObj = Object.fromEntries( // this will recreate your object
    arr.slice(idx) // get the ending part of the array, starting on key
      .concat(arr.slice(0,idx)) // concatenate the beginning
    )
  return newObj
}

console.log(rotateOrder('Ju',periods))

Вы также можете использовать unshift (с оператором спреда) вместо concat. Я не знаю, какой из них работает лучше:

function rotateOrder(key, obj) {
  let idx = Object.keys(periods).indexOf(key) // find the index of your key
  let arr = Object.entries(periods)  // this transform your object into an array

  // move the ending part (starting from key) to the beginning
  arr.unshift(...arr.splice(idx)) 

  let newObj = Object.fromEntries(arr) // this will recreate your object
  return newObj
}

Примечание из MDN веб-документов :

Начиная с ECMAScript 2015, объекты сохраняются порядок создания строковых и символьных ключей. В JavaScript движках, которые соответствуют ECMAScript 2015 spe c, итерирование по объекту только со строковыми ключами приведет к ключам в порядке вставки.

0 голосов
/ 19 февраля 2020

Мы можем переупорядочить / изменить массив, используя object.entries и функцию сортировки :

Код:

 let periods = {
      "Su": 6,
      "Mo": 10,
      "Ma": 7,
      "Ra": 18,
      "Ju": 16,
      "Sa": 19,
      "Me": 17,
      "Ke": 7,
      "Ve": 20,
    };

    let keysSorted = Object.entries(periods).sort(function (a, b) {
      return a[1] - b[1]
    })
    console.log(keysSorted);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...