如何在javascript中对键/值对象进行排序?

时间:2017-06-08 21:38:49

标签: javascript key-value

关注How can I add a key/value pair to a JavaScript object?Best way to store a key=>value array in JavaScript?,我构建了我的键/值地图(对象)。

我在下面构建它,MyFunc返回一个数组:

let MyMap = {}; // object
for(let i = 0; i < MyContainer.length; i++)
{
   // create the key (id of current element) and set its value as array of elements (result from MyFunc)
   await MyFunc(MyContainer[i]).then((response) => MyMap[MyContainer[i].id] = response); 
}

MyMap看起来像这样:

MyMap = 
{
   1: [Object, Object, Object, …] // 13 elements
   2: [Object, Object, Object, …] // 7 elements
   3: [Object, Object, Object, …] // 4 elements
   4: [Object]
   5: [Object]
   6: [Object, Object, Object, …] // 5 elements
   7: [Object, Object, Object, …] // 9 elements
}

我想迭代我的地图(键),但是从具有最小值的键(最小的数组)开始。

因此,我想:

  • 访问MyContainer并选择标识为4的元素,并执行填充(具有最小的数组:1个元素)
  • 然后访问MyContainer并选择标识为5的元素,并执行填充
  • 然后3
  • 然后6
  • .. etc
  • 最后访问MyContainer并选择标识为1的元素并执行填充(具有最大数组:13个元素)

既然myMap是一个对象,那么我就无法对其进行排序。

我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:2)

最终,您无法使用对象,因为无法保证键的顺序

你可以:

  • 使用Object.keys(obj)将对象的密钥作为Array
  • 获取
  • 使用这些键构建结构的Array个对象,数组中的每个项目都是原始对象的键/值对。
  • 然后根据对象中Array的长度对item.value个对象进行排序。在这种情况下,item.value是您原始对象的Array s

&#13;
&#13;
const obj = {
  "1": [1, 2, 3],
  "2": [1],
  "3": [1, 2],
  "4": [1, 2, 3, 4]
};

// Transform object into a nested array
// Each array item contains the value of a key of your original object,
// which itself is an Array
const arr = Object.keys(obj).reduce((arr, key) => {
 arr.push({ key: key, value: obj[key] });
 
 return arr;
}, [])

// Sort the nested Array based on the length of each item
const sortedArr = arr.sort((a, b) => a.value.length - b.value.length);

console.log(sortedArr);
&#13;
&#13;
&#13;

与上述相同但更紧凑,使用链接

&#13;
&#13;
const obj = {
  "1": [1, 2, 3],
  "2": [1],
  "3": [1, 2],
  "4": [1, 2, 3, 4]
};

const sortedArr = Object.keys(obj).reduce((arr, key) => {
  arr.push({ key: key, value: obj[key] });

  return arr;
}, [])
.sort((a, b) => a.value.length - b.value.length)

console.log(sortedArr);
&#13;
&#13;
&#13;