是否可以使用slice()
JavaScript对象?
假设我有一个对象x = {a:1, b:2, c:3, d:4}
,该如何砍掉它的第一个属性(就像在数组上使用.slice(1)
方法一样),所以我得到x = {b:2, c:3, d:4}
?
在这里(可以追溯到几年前)曾多次提出相同的问题,但没有一个人得到答案,这正好提供了我需要的解决方案,并且看起来像今天一样过时。
答案 0 :(得分:0)
此答案在很大程度上取决于问题中是否缺少定义的键顺序条件。如果定义了键顺序,则可以轻松创建解决方案,因为可以创建转换或排序算法以按确定的顺序处理键。
由于评论中的冗长讨论已得到结论性证明,由于该问题并未明确说明键的顺序标准,因此没有安全的方法来保证通过任何方法切分的元素确实会被人类观察者作为“第一要素”。
@JordanRunning提到的article已经声明将具有整数值或整数可转换值的键放在首位。
此后,@ Paulpro提到Object.getOwnPropertyNames和Reflect.ownKeys具有确定的顺序,但是自ES6开始,Object.keys和Object.entries没有确定的顺序。
如果元素只是问题中的这4个键,则在将顺序保证为按时间顺序排列的字符串键之后,使用Object.getOwnPropertyNames或Reflect.ownKeys的答案将是可能的。但是一旦我们不知道是否会有一个具有整数(或整数可转换)名称的属性,甚至不知道在z
元素之后会发生什么,就没有定论。
例如:假设对象键最初是字母顺序的。 z之后会发生什么?下一个键是aa,ab等?如果是,那么...但是还有很多其他可能性...如果z到1之后怎么办?还是如果是非标准字符的西里尔字母?例如,葡萄牙语带有重音字母,在某些算法中,字母紧跟在所有其他字母之后。因此,您有一个A排在第一位,一个Á在Z后面。如果创建该对象的算法错误地将其排序并按时间顺序排列错了怎么办?
底线:不能使用对象。改用Map,数组或任何其他解决方案,或按已明确规定的顺序定义键顺序。
答案 1 :(得分:-3)
使用可以通过切片和贴图功能解决此问题
var obj = {0: 'zero', 1: 'one', 2: 'two', 3: 'three', 4: 'four'};
var result = Object.keys(obj).slice(0,2).map(key => ({[key]:obj[key]}));
console.log(result);
然后将得到
[ { '0': 'zero' }, { '1': 'one' } ]