【问题标题】:Convert array to object without sorting keys in javascript将数组转换为对象而不在javascript中对键进行排序
【发布时间】:2020-08-16 01:52:00
【问题描述】:

我有一个对象

{
1: {id: 1, first: 1, last: 5}
2: {id: 2, first: 6, last: 10}
3: {id: 3, first: 11, last: 15}
}

我需要颠倒项目顺序而不对键进行排序,所以最终结果是:

{
1: {id: 3, first: 11, last: 15}
2: {id: 2, first: 6, last: 10}
3: {id: 1, first: 1, last: 5}
}

这可能吗?

我尝试将其转换为数组,然后转换为对象,但新对象以键 0 开头,而我需要它以键 1 开头:

let array = [];
Object.values(this.props.items)
.sort()
.reverse()
.forEach(function(b) {
    array.push(b);
});

const newItems = Object.assign({}, array);

// Result:
{
0: {id: 3, first: 11, last: 15}
1: {id: 2, first: 6, last: 10}
2: {id: 1, first: 1, last: 5}
}

编辑

值得一提的是我的对象是键入的:

顺便说一句,this.props.items 被键入 TypeScript 对象,例如。 Section.Item[]

【问题讨论】:

  • let array = [{}]; 从位置 0 的元素开始,然后是 delete newItems[0];
  • @palaѕн N.B.这个 OP 想要随机排列哪些值存储在键 123 下,而不是对键本身进行排序。

标签: javascript reactjs typescript sorting javascript-objects


【解决方案1】:

您可以获取键和值并将弹出的值分配给键。

var object = { 1: { id: 1, first: 1, last: 5 }, 2: { id: 2, first: 6, last: 10 }, 3: { id: 3, first: 11, last: 15 } },
    values = Object.values(object)

Object.keys(object).forEach(k => object[k] = values.pop());

console.log(object);

【讨论】:

  • 我正在考虑删除我的答案,因为您无法颠倒对象值的顺序。 entries 的文档说 same order as that provided by a for...infor initerates over the properties of an object in an arbitrary order 所以如果没有固定的顺序,没有什么可以逆转的。代码是偶然的,而不是设计的。
  • @HMR,对象有一个定义的顺序(现在)。首先它需要类似索引的值(正 32 位整数值),然后是插入顺序中的所有其他值,最后是符号。是的,您可以颠倒值的顺序。
【解决方案2】:

你可以使用fromEntries

const data = {
  1: { id: 1, first: 1, last: 5 },
  2: { id: 2, first: 6, last: 10 },
  3: { id: 3, first: 11, last: 15 },
};
console.log(
  Object.fromEntries(
    Object.values(data)
      .reverse()
      .map((val, index) => [index + 1, val])
  )
);

【讨论】:

  • @nickornotto 实际上;尼娜的回答更准确。如果您的对象具有 {2:{},5:{}} 之类的键,则相反的是:{5:{},2:{}}。但实际上没有一个答案是正确的,因为您无法在 JavaScript 中反转对象中的键,因为不能保证对象的键按特定顺序出现。
  • @HMR 我对“不能保证对象的键按特定顺序出现”感到有些困惑,因此“没有答案是正确的”——确实键没有很好地排序(至少对于某些操作)但问题中的 OP 示例并没有要求更改键顺序的解决方案,而是要求对键下的值进行洗牌的解决方案(仍然与 pre 相同的 1,2,3 顺序-转型)。看来您确实已经有了一个很好的答案。还是我误读了 OP 的示例输入/输出?
  • @apsillers 你是对的,OP 要求反转值。如果你有一个像{1:val1,2:val2} 这样的对象,那么val1val2 没有顺序,所以你不能颠倒它们。 entries 的文档说 same order as that provided by a for...infor initerates over the properties of an object in an arbitrary order 所以如果没有固定的顺序,就没有什么可以逆转的。
  • @HMR 我想其他答案也可能是正确的,但它们不适用于我的特定示例。只有你的答案对我有用。
【解决方案3】:

也许你可以试试这个

let obj = {
  1: {id: 1, first: 1, last: 5},
  2: {id: 2, first: 6, last: 10},
  3: {id: 3, first: 11, last: 15}
}

const newItems = {}
let totalKeys = Object.keys(obj).length

for (let key in obj) {
  newItems[totalKeys] = obj[key];

  totalKeys -= 1;
}

console.log(newItems);

【讨论】:

  • 我尝试了类似的代码,但我得到了:Element implicitly has an 'any' type because expression of type 'number' can't be used to index type '{}'. No index signature with a parameter of type 'number' was found on type '{}'. 我在你的线上得到了同样的结果:newItems[totalKeys] = obj[key]; 这是TypeScript 虽然我不太了解的东西。 @havus
猜你喜欢
  • 2019-10-01
  • 2011-06-23
  • 1970-01-01
  • 2016-12-23
  • 2013-12-03
  • 1970-01-01
  • 1970-01-01
  • 2021-10-30
  • 2016-09-01
相关资源
最近更新 更多