Сортировать ключи объекта с отсортированным массивом - PullRequest
0 голосов
/ 06 сентября 2018

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

var obj = {
  c: "see",
  a: "ay",
  b: "bee",
  d: "dee"
};

console.log("Object order:");
var key, keys = [];
for (key in obj) {
  keys.push(key);
}
console.log(keys.map(function(key) { return key + ": " + obj[key];}).join(", "));

console.log("Sorted order:");
keys = Object.keys(obj).sort()
console.log(keys.map(function(key) { return key + ": " + obj[key];}).join(", "));

Приведенный выше выводит порядок объектов a, b, c, d, но, скажем, я хочу, чтобы массив имел мой собственный порядок, например

var sortedArray = ['b','c','d','a'];

Итак, как мне узнать, внедрить это sortedArray в мой .sort?

Ожидаемый результат:

var newObj = {
  b: "bee",
  c: "cee",
  d: "dee",
  a: "ay"
};

Спасибо

Ответы [ 5 ]

0 голосов
/ 07 октября 2018

Простите, я спрашиваю, но если отношение между порядком сортировки и объектом однозначно, почему бы нам не сделать что-то подобное (начиная с массива порядка сортировки):

var myObject = {c: "see", a: "ay", b: "bee", d: "dee"};
var sortOrder = ['b','c','d','a'];

const mySort = (obj, order) => order.reduce((r,c) => (r[c] = obj[c], r), {})

console.log(mySort(myObject, sortOrder))

Казалось бы, это было бы гораздо более кратко и просто, поскольку в нем используется только одно сокращение .

0 голосов
/ 06 сентября 2018

Это очень странный шаблон для сортировки, но, как вы хотите, я создал функцию с именем CustomOrderBy, которая будет выполнять сортировку на основе массива ключей.

Примерно так:

  1. У вас есть массив с ключами, которые вы хотите упорядочить с первого до последнего, как у вас уже есть (sortedArray). Затем вы передаете этот массив функции.

  2. Затем функция перебирает клавиши obj и получает первую букву, чтобы проверить, совпадает ли она с массивом клавиш, получая свой индекс. По индексу сортирует.

  3. После сортировки он создает новый объект и устанавливает ключ и значение в порядке, который он создал в функции sort, использованной до

Пожалуйста, ознакомьтесь с кодом, чтобы улучшить его.

var sortedArray = ['b', 'c', 'd', 'a'];

var obj = {
  c: "see",
  a: "ay",
  b: "bee",
  d: "dee"
};

function CustomOrderBy(keyOrder){
  let keysSorted = Object.keys(obj).sort(function(keyA, keyB) {
    let idxA = keyOrder.indexOf(keyA[0]);  
    let idxB = keyOrder.indexOf(keyB[0]);
    if (idxA > idxB){
      return 1
    }else if(idxA < idxB){
      return -1
    }else{
      return 0;
    }  
  });

  let sorted = {};
  for (var key of keysSorted){
    if (obj[key] != null){
      sorted[key] = obj[key];
    }
  }
  return sorted;
}
console.log(CustomOrderBy(sortedArray))
0 голосов
/ 06 сентября 2018

вы можете создать функцию, как я сделал ниже. и передайте ваш объект, он вернет вам отсортированный объект.

    var obj = {
        c: "see",
        a: "ay",
        b: "bee",
        d: "dee"
    };


    function sortObject(obj)
    {
        var keys = [];
        var outputObj = {};

        for (key in obj)
        {
            keys.push(key);
        }

        keys.sort();

        for(var i=0; i<keys.length; i++){
            outputObj[keys[i]] = obj[keys[i]];
        }

        return outputObj;
    }
    
    console.log(sortObject(obj));
0 голосов
/ 06 сентября 2018

Использовать пользовательский сортировщик, который использует indexOf()

var sortedArray = ['b', 'c', 'd', 'a'];

var obj = {
  c: "see",
  a: "ay",
  b: "bee",
  d: "dee"
};


var keys = Object.keys(obj).sort(function(a, b) {
  // TODO - cases where not in sortedArray
  return sortedArray.indexOf(a) - sortedArray.indexOf(b)
});


console.log(keys)
0 голосов
/ 06 сентября 2018

Вы можете передать свою пользовательскую функцию сортировки в sort() API. Смотрите пример ниже:

var items = [
  { name: 'Edward', value: 21 },
  { name: 'Sharpe', value: 37 },
  { name: 'And', value: 45 },
  { name: 'The', value: -12 },
  { name: 'Magnetic', value: 13 },
  { name: 'Zeros', value: 37 }
];
    
// sort by value
items.sort(function (a, b) {
  return a.value - b.value;
});

// sort by name
items.sort(function(a, b) {
  var nameA = a.name.toUpperCase(); // ignore upper and lowercase
  var nameB = b.name.toUpperCase(); // ignore upper and lowercase
  if (nameA < nameB) {
    return -1;
  }
  if (nameA > nameB) {
    return 1;
  }

  // names must be equal
  return 0;
});

console.log(items)
...