【问题标题】:Sort hash key. Is fetch order is fixed?排序哈希键。获取顺序是固定的吗?
【发布时间】:2020-03-30 20:44:28
【问题描述】:

我有两个像下面这样的对象哈希。

a[13] = obj2
a[25] = obj3
a[35] = obj4
a[54] = obj1

sortKey[13] = {order:2}
sortKey[25] = {order:3}
sortKey[35] = {order:4}
sortKey[54] = {order:1}

然后我这样获取:

for (var key in a) {
  console.log(a[key]) // it shows obj2, obj3, obj4, obj1
}

我要显示 obj1、obj2、obj3、obj4。

那么,我可以按sortkeya 进行排序吗?
是否可以对哈希进行排序?

【问题讨论】:

  • 应该sortKey[45] = {order:1}sortKey[54]
  • 要对元素列表进行排序,我宁愿使用数组而不是对象。当涉及到键顺序时,对象是不可预测的。
  • @Nick Parsons 啊是的,这是我的赌注

标签: javascript html


【解决方案1】:

没有很好的方法来改变 javascript 对象中键值对的顺序。类整数键会首先按升序返回,然后按插入顺序返回字符串键,然后按插入顺序返回符号键

但是,您可以将自定义迭代器附加到将控制迭代器 (for..of) 在应用于此对象时如何返回值的对象。在没有方便抽象的最简单形式中,它看起来像这样:

const obj1 = { name: 'obj1' }
const obj2 = { name: 'obj2' }
const obj3 = { name: 'obj3' }
const obj4 = { name: 'obj4' }

const a = {}
a[13] = obj2
a[25] = obj3
a[35] = obj4
a[54] = obj1

const sortKey = {}
sortKey[13] = {order:2}
sortKey[25] = {order:3}
sortKey[35] = {order:4}
sortKey[54] = {order:1}

a[Symbol.iterator] = function() {
  const e = Object
    .entries(this)
    .sort((a,b) => sortKey[a[0]].order - sortKey[b[0]].order)

  let _c = 0

  return {
    next: () => {
      return e[_c] ? { value: e[_c++][1], done: false } : { done: true }
    },
  }
}

for (const v of a) {
  console.log(v)
}

【讨论】:

  • 我理解哈希不保持顺序的基本思想。我将使用一些解决方法。你的例子对我也很有帮助。
【解决方案2】:

密钥将以不可预知的顺序返回。您可以检索键列表,对该列表进行排序,然后使用该排序列表检索值。这是使用哈希表时的唯一方法。请注意,您正在消耗哈希表和列表的存储空间。

【讨论】:

    猜你喜欢
    • 2012-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-31
    • 2019-03-19
    • 2018-07-21
    • 2011-12-09
    • 1970-01-01
    相关资源
    最近更新 更多