Подтвердить что ты не робот

Можно ли прокрутить объект javascript в обратном порядке?

Итак, у меня есть JavaScript-объект, подобный этому:

foo = {
  "one": "some",
  "two": "thing",
  "three": "else"
};

Я могу сделать это так:

for (var i in foo) {
  if (foo.hasOwnProperty(i)) {
    // do something
  }
}

Что будет проходить через свойства в порядке one > two > three.

Однако иногда мне нужно пройти в обратном порядке, поэтому я хотел бы сделать тот же цикл, но three > two > one.

Вопрос:
Есть функция "объект-реверс". Если бы это был массив, я мог бы изменить или построить новый массив с помощью unshift, но я потерялся с тем, что делать с объектом, когда мне нужно изменить его свойства. Любые идеи?

Спасибо!

4b9b3361

Ответ 1

Объекты Javascript не имеют гарантированного врожденного порядка, поэтому не существует "обратного" порядка.

4.3.3 Объект Объект является членом типа Object. Это неупорядоченная коллекция свойств, каждая из которых содержит примитив значение, объект или функцию. Функция, хранящаяся в свойстве объект называется методом.

Браузеры, похоже, возвращают свойства в том же порядке, в котором они были добавлены к объекту, но поскольку это не является стандартным, вы, вероятно, не должны полагаться на это поведение.

Простая функция, которая вызывает функцию для каждого свойства в обратном порядке, как указано в браузере для..in, заключается в следующем:

// f is a function that has the obj as 'this' and the property name as first parameter
function reverseForIn(obj, f) {
  var arr = [];
  for (var key in obj) {
    // add hasOwnPropertyCheck if needed
    arr.push(key);
  }
  for (var i=arr.length-1; i>=0; i--) {
    f.call(obj, arr[i]);
  }
}

//usage
reverseForIn(obj, function(key){ console.log('KEY:', key, 'VALUE:', this[key]); });

Рабочий JsBin: http://jsbin.com/aPoBAbE/1/edit

Снова я говорю, что порядок for..in не гарантируется, поэтому обратный порядок не гарантируется. Используйте с осторожностью!

Ответ 2

Нет способа прокрутить объект назад, но если вы воссоздаете объект в обратном порядке, тогда вы будете золотыми! Будьте осторожны, однако нет ничего, что говорит о том, что порядок объекта останется таким же, как и он, и это может привести к некоторому интересному результату, но по большей части он работает...

function ReverseObject(Obj){
    var TempArr = [];
    var NewObj = [];
    for (var Key in Obj){
        TempArr.push(Key);
    }
    for (var i = TempArr.length-1; i >= 0; i--){
        NewObj[TempArr[i]] = [];
    }
    return NewObj;
}

Просто сделайте своп на своем объекте, как это -

MyObject = ReverseObject(MyObject);

Тогда цикл будет выглядеть следующим образом:

for (var KeysAreNowBackwards in MyObject){
    alert(MyObject[KeysAreNowBackwards]);
} 

Ответ 3

Почему там никто не упомянул Object.keys()?

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

let foo = {
  "one": "some",
  "two": "thing",
  "three": "else"
};

// Get REVERSED Array of Propirties
let properties = Object.keys(foo).reverse();
// "three"
// "two"
// "one"

// Then you could use .forEach / .map
properties.forEach(prop => console.log('PropertyName: ${prop}, its Value: ${foo[prop]}'));

// PropertyName: three, its Value: else
// PropertyName: two, its Value: thing
// PropertyName: one, its Value: some

Ответ 4

Просто используйте Object.keys()

Эта функция позаботится об этом за вас:

function loopObject(obj, reverse, logic){
    let keys = reverse? Object.keys(obj).reverse() : Object.keys(obj)
    for(let i=0;i<keys.length;i++){
        logic(obj[keys[i]])
    }
}

Пример объекта:

let my_object = {
    one: 'one',
    two: 'two',
    three: 'three'
}

Цикл по порядку:

loopObject(my_object, false, val => {
    console.log(val) // Insert your logic here.
})

// "one"
// "two"
// "three"

Петля в обратном направлении:

loopObject(my_object, true, val => {
    console.log(val) // Insert your logic here.
})

// "three"
// "two"
// "one"

Ответ 5

Вы можете использовать функцию unshift для хранения ваших элементов в обратном порядке внутри массива.

function reverse(items, func){
    var reversed = Array();
    for( var key in items ){
        reversed.unshift(items[key]);
    }
    if( func ){
        for( var key in reversed ){
            func(key, reversed[key]);
        }
    }
    return reversed;
}

Использование

// Loop through your object in reverse order
reverse(foo, function(key, obj){
    console.log(key, obj);
});

// Get a reversed copy of your object
var reversedObject = reverse(foo);

// Loop through your object in reverse order and get a reversed copy
var reversedObject = reverse(foo, function(key, obj){
    console.log(key, obj);
});

Ответ 6

Этот ответ похож на пару других, но некоторым пользователям может показаться, что приведенный ниже код проще скопировать и вставить для собственных нужд:

Object.keys(foo).reverse().forEach(function(key) { console.log(foo[key]) });

Для объекта "foo", как описано в вопросе, этот код выведет элементы объекта в обратном порядке: "else", "thing", "some"