2013-03-23 2 views
4

Мне нужно удалить все из хеша/объекта и сохранить ссылку. Вот примерКак удалить все элементы из хэша и сохранить ссылку

var x = { items: { a: 1, b: 2} } 

removeItems(x.items) ; 
console.log(x.items.clean) ; 

function removeItems(items) { 
    var i ; 
    for(i in items; i++) { 
     delete items[i] ; 
    } 

    items.clean = true ; 
} 

мне было интересно, если есть более короткий путь для достижения этой цели. Например, чистка массива может быть выполнена следующим образом:

myArray.length = 0 ; 

Любые предложения?

+0

«i ++» в вашем коде бесполезен. –

+0

Я не думаю, что для этого есть ярлык. –

+3

Почему вы хотите «сохранить ссылку»? –

ответ

8

В настоящий момент нет простого способа сделать это, однако комитет ECMAScript видит эту потребность и находится в текущей спецификации для следующей версии JS.

Вот альтернативное решение, используя ECMAScript 6 maps:

var x = {} 
x.items = new Map(); 
x.items.set("a",1); 
x.items.set("b",2); 

//when you want to remove all the items 

x.items.clear(); 

Here is a shim for it так что вы можете использовать его в течение дня браузеров.

0

Существует не более короткий путь, извините. Однако в вашей петле не должно быть i++.

function removeItems(items) { 
    for(var i in items) { 
    delete items[i]; 
    } 

    items.clean = true; 
} 

Реструктуризация кода и просто делать x.items = {} бы лучше, хотя.

+2

Когда вы знаете, откуда приходит ваш объект, вам не нужно использовать hasOwnProperty. –

+0

@dystroy Потенциально, но вы никогда не знаете, когда что-то еще загрузилось, возможно, увеличит прототип объекта и не сделает его неперечислимым. – loganfsmyth

+1

Это просто усердно. Если вы используете глупую библиотеку, у вас может быть много других случайных вещей. –

1

Это не работает:

var i ; 
for(i in items; i++;) { 
    delete items[i] ; 
} 

Это создает for-loop с кодом инициализации i in items (который кстати оценивает в false, как нет "undefined" ключа в items, но это не имеет значения), и состояние i++ и нет кода обновления. Тем не менее i++ оценивает фальшивость NaN, поэтому ваш цикл сразу же прерывается. И без второй точки с запятой, это даже как SyntaxError.

Вместо этого, вы хотите for-in-loop:

for (var i in items) { 
    delete items[i]; 
} 

Btw, items.clean = true; бы создать новое свойство снова так что объект не будет действительно "чистый" :-)

мне было интересно, если есть более короткий путь для достижения этого. Например, очистка массива может быть выполнена следующим образом:

Нет. Вы должны закодировать все свойства и удалить их.

+0

+1 для объяснения, почему код OP не работает, и разница между циклами for и for..in. –

Смежные вопросы