Как удалить первое свойство объекта, например:

var obj = { x:1, y:2, z:3 };

Так что obj становится:

{ y:2 , z:3 };

Этот подход не работает для меня:

delete obj.x

Поскольку я не знаю каких-либо подробностей о свойствах объекта.

Мне просто нужно удалить первое свойство.

0
27mdmo7sn 17 Авг 2019 в 19:04

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 преформанс все еще хуже.

< Сильный > Chrome :
введите описание изображения здесь

< Сильный > IE11 :
введите описание изображения здесь

< Сильный > Firefox :
введите описание изображения здесь

Не проверено больше браузеров, так как эти 3 являются единственными, для которых я разрабатываю (да ... IE11 ...). Удивило также, что IE11 имеет лучшую производительность, чем Firefox. Обычно это намного хуже.

Кажется, что издержки Object.keys() связаны с созданием массива, но общая производительность изменяется в зависимости от количества свойств в обоих направлениях. Спасибо, что сказали мне сделать несколько тестов Джонас Уилмс.

0
Jorge Fuentes González 17 Авг 2019 в 17:02

В современных средах 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

3
CollinD 17 Авг 2019 в 16:21