我试图将一个复杂的对象包装在一个长度为1的数组中(即该对象是该数组中的唯一条目),并希望在类构造函数中完成此操作。。。为了达到这个目的,我一直在使用[].slice.call(),当我出于测试目的而使用时,我在控制台中尝试了以下内容:
foo = {"a":{"a1":1},"b":{"b1":2},length: 2};
[].slice.call(foo);
我得到了一个长度为2的数组,其中有“两个空插槽”。
假设[].slice.call({"a": 1, "b": 2, length: 2}
产生了[1, 2]
,我期望得到一个长度为2的数组,如下所示:{"a1":1},{"b1":2},而不是"two empty slots“。[].slice.call只在“一维”对象上工作,还是有其他事情在发生?非常感谢提前,如果有人可以请澄清!
发布于 2019-03-31 05:04:13
slice
将只迭代对象的数字索引属性。请参阅spec
让ToInteger(start).成为
(因此,如果start
为undefined
,就像在没有参数的情况下调用slice
时一样,则relativeStart
为0
)
然后,它将遍历从relativeStart
(如果relativeStart
为负数,则为0 )到对象的length
属性的值的数字索引:
所以:
是[].slice.call只在“一维”对象上工作,还是有其他事情在发生?
它仅适用于具有数字属性的对象。如果您有非数值型属性,则不会使用slice
迭代这些属性。
如果你想
将一个复杂的对象包装在一个长度为1的数组中(即,该对象是该数组中唯一的条目)
然后使用[foo]
,例如:
const foo = {"a":{"a1":1},"b":{"b1":2},length: 2};
const wrappedFoo = [foo];
console.log(wrappedFoo);
有没有简单的办法把{"a":{"a1":"foo"},“b”:{“b1”:“”}}变成{"a1":"foo"},{"b1":"bar"}?
使用Object.values
将对象的值提取到数组中:
const obj = {"a":{"a1":"foo"},"b":{"b1":"bar"}};
const arr = Object.values(obj);
console.log(arr);
发布于 2019-03-31 05:08:24
正如CertainPerformance已经提到的,您用作call()
的参数的object
将作为slice()
的this
参数传递,它只适用于对象的数值属性。如果您使用数字属性,它将按照您的预期工作:
let foo1 = {"0": 1, "1": 2, length: 2};
console.log([].slice.call(foo1));
let foo2 = {"0": {"a1":1}, "1": {"b1":2}, length: 2};
console.log([].slice.call(foo2));
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}
然而,这是一种获取Object.values()已经提供的功能的罕见方式:
let foo1 = {"0": 1, "1": 2};
console.log(Object.values(foo1));
let foo2 = {"0": {"a1":1}, "1": {"b1":2}};
console.log(Object.values(foo2));
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}
https://stackoverflow.com/questions/55437996
复制