【问题标题】:Object.entries() but objects instead of arrayObject.entries() 但对象而不是数组
【发布时间】:2018-03-01 16:44:08
【问题描述】:

假设我有一个对象:

var obj = { a:{}, b:1, c: new Set() };

如果没有工作,对象是不可迭代的,而且 Object.keys/values/entries 并不是我想要的。 Object.entries() 很接近,但我更希望它返回一个对象数组而不是二维数组,理想情况下引用完整无缺(在适当的情况下)。

比如:

Object.items( obj ) = [ { a: {} }, { b: 1 }, { c: new Set() } ];

我知道我可以使用 Object.entries() 创建一个函数来执行此操作,我只是想确认没有类似的东西。

【问题讨论】:

  • 单一属性对象没有多大意义,也很难处理。你需要这种奇怪的格式做什么?不,标准库中确实没有这样做。
  • “引用完整”是什么意思?
  • @Bergi 大概他的意思是a{} 值应该是结果中的同一个对象。这很难避免,除非您花费额外的时间来制作副本。
  • 但是如果他认为改变原来b的值1会传播到无法完成的结果(反之亦然)。
  • @Barmar Well {get [key]() { return orig[key]; }, set [key](v) { orig[key] = v; }} 甚至可以做到这一点:-)

标签: javascript object methods


【解决方案1】:

你是对的,没有任何东西可以做到这一点。您需要构建自己的函数,entries 是一个很好的起点。

var obj = { a:{}, b:1, c: new Set() };
var obj2 = Object.entries(obj).map((array) => ({ [array[0]]: array[1] }));

console.log(obj2);
console.log(obj2[2].c === obj.c);

【讨论】:

  • 你也可以使用解构来摆脱[0][1]
【解决方案2】:

您可以为对象定义Symbol.iterator,并采用只有一个属性的单个对象。

var obj = { a:{}, b:1, c: new Set() },
    array;
    
obj[Symbol.iterator] = function* () {
    for (var [key, value] of Object.entries(this)) {
        yield { [key]: value };
    }
};

array = Array.from(obj);

console.log(array);
console.log(array[2].c === obj.c);

【讨论】:

    猜你喜欢
    • 2017-04-18
    • 2020-02-14
    • 1970-01-01
    • 1970-01-01
    • 2015-03-20
    • 1970-01-01
    • 1970-01-01
    • 2014-08-21
    • 2011-03-10
    相关资源
    最近更新 更多