Как удалить первое свойство объекта, например:
var obj = { x:1, y:2, z:3 };
Так что obj
становится:
{ y:2 , z:3 };
Этот подход не работает для меня:
delete obj.x
Поскольку я не знаю каких-либо подробностей о свойствах объекта.
Мне просто нужно удалить первое свойство.
2 ответа
Прежде всего: Javascript (ES5) не гарантирует порядок собственности. На ES5 все еще работают браузеры (IE11, к сожалению, хотя они частично сохраняют порядок свойств), поэтому в зависимости от среды я рекомендую вам следовать этому правилу.
Это действительно очень важный момент.
Теперь, после того, как вы поймете, почему вы не должны этого делать, я объясню способ удаления первого свойства (что бы ни было первым в вашей текущей среде).
Вы можете сделать это двумя способами. Самый эффективный способ в IE11 и Firefox это:
for (var i in obj) {
delete obj[i];
break;
}
А также вы можете сделать:
delete obj[Object.keys(obj)[0]];
Который менее эффективен в IE и Firefox, но лучше в Chrome (тест производительности ниже):
function newList() {
var objs = [];
var props = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMOPQRSTUVWXYZ";
for (var i = 0; i < 200000; i++) {
var obj = {};
for (var ii = 0; ii < props.length; ii++) {
obj[props[ii]] = ii;
}
objs.push(obj);
}
return objs;
}
var objs = newList();
console.time("Object.keys()");
for (var i = 0; i < objs.length; i++) {
delete objs[i][Object.keys(objs[i])[0]];
}
console.timeEnd("Object.keys()");
objs = newList();
console.time("for...in");
for (i = 0; i < objs.length; i++) {
for (var j in objs[i]) {
delete objs[i][j];
break;
}
}
console.timeEnd("for...in");
ПРИМЕЧАНИЕ . Вау, сюрприз для меня. В V8 Object.keys () работает довольно хорошо прямо сейчас. Но в Firefox и IE11 преформанс все еще хуже.
Не проверено больше браузеров, так как эти 3 являются единственными, для которых я разрабатываю (да ... IE11 ...). Удивило также, что IE11 имеет лучшую производительность, чем Firefox. Обычно это намного хуже.
Кажется, что издержки Object.keys()
связаны с созданием массива, но общая производительность изменяется в зависимости от количества свойств в обоих направлениях. Спасибо, что сказали мне сделать несколько тестов Джонас Уилмс.
В современных средах JS (ES2015 +) порядок ключей четко определен, поэтому вы должны иметь возможность сделать что-то вроде этого:
const keys = Reflect.ownKeys(obj); // thanks to Paulpro for improving this!
if (keys.length) delete obj[keys[0]];
Обратите внимание, что delete
не будет всегда работать, но для большинства «обычных» объектов это должно делать то, что вам нужно.
Поскольку существует некоторая конкуренция в отношении упорядочения объектов JS, вот стандарт ECMAScript: https://www.ecma-international.org/ecma-262/6.0/#sec-vals-object-internal-methods-and-internal-slots- ownpropertykeys
Похожие вопросы
Связанные вопросы
Новые вопросы
javascript
По вопросам программирования на ECMAScript (JavaScript/JS) и его различных диалектах/реализациях (кроме ActionScript). Обратите внимание, что JavaScript — это НЕ Java. Включите все теги, относящиеся к вашему вопросу: например, [node.js], [jQuery], [JSON], [ReactJS], [angular], [ember.js], [vue.js], [typescript], [стройный] и т. д.