【问题标题】:How to sort key/value objects in javascript?如何在javascript中对键/值对象进行排序?
【发布时间】:2017-06-13 19:42:38
【问题描述】:

按照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 并选择 id 为 4 的元素,然后执行操作(具有最小数组:1 个元素)
  • 然后访问 MyContainer 并选择具有 id 5 的元素,然后做一些事情
  • 然后3
  • 然后6
  • ..等
  • 最后访问 MyContainer 并选择 id 为 1 的元素并执行操作(最大数组:13 个元素)

现在既然myMap是一个对象,那我就不能排序了。

我怎样才能做到这一点?

【问题讨论】:

  • 好吧,用数组代替。
  • Map 有一个 keys() 函数,只需对它们进行排序和迭代即可。
  • @FrederikHansen 这不是Map,他只是在调用常规对象文字myMap

标签: javascript key-value


【解决方案1】:

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

你可以:

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

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);

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

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);

【讨论】:

  • 我明白了,但我仍然不确定如何实现它。你能为我的OP提供一个代码吗?我有属性作为 ID,其中每个 ID 都有一个 元素数组 作为值。我想先按最小数组(最小长度)迭代属性
  • 您需要向我们展示您在代码中拥有的当前数据结构的示例
  • 对不起,但这对我来说仍然不清楚。我用我当前的数据结构和我想要的所需过程编辑了我的 OP
  • 那么如何跟踪哪一行到哪一个属性(ID)呢?目前我有property(can be any integer) -> value (array),如果我转换为二维数组,那么我将有index(starts from 0) -> value (row of elements)。因此我失去了any integer
  • 是的,但我也想要属性.. 我想从最小的数组开始,真的,但同时我想知道这个数组属于哪个 ID(在我的 OP 中,请参阅我从哪里得到 ID?这变成了属性,现在我想去 MyContainer 并选择具有最小数组的元素,然后是下一个,然后是下一个,直到我完成所有操作。
猜你喜欢
  • 2018-03-06
  • 1970-01-01
  • 1970-01-01
  • 2021-03-06
  • 2023-02-03
  • 1970-01-01
  • 2021-08-19
  • 1970-01-01
  • 2021-10-30
相关资源
最近更新 更多