2017-02-05 3 views
1
function removeString(obj) { 
    var propertyArray = Object.values(obj);   //make array of just properties 
    for(var i = 0; i < propertyArray.length; i++) { 
    if (typeof propertyArray[i] === "string")   //find string 
    delete Object.keys(obj)[i]; //delete the key with the same index as the string 
    }         
    return obj;//return new object without string 
} 

var testObject = {size: 6, name: 'String', age: 20} 

console.log(removeString(testObject)) //I want {size: 6, age: 20} 

Я хочу, чтобы функция выше функции удаляла поле со значением string вместо того, что возвращается, является исходным объектом.Удаление пары ключ/значение javascript по индексу

Кому-нибудь, кто это читает/желает помочь, за вас заранее!

ответ

3

Вам нужно сделать:

delete obj[Object.keys(obj)[i]] 

Кроме delete Object.keys(obj)[i]. Прямо сейчас вы просто удаляете полученное значение name, а не имущество nameobj, являющееся obj["name"]. Поэтому он никогда не удалялся с obj. Вот фрагмент пример:

function removeString(obj) { 
 

 
var propertyArray = Object.values(obj);    
 
for(var i = 0; i < propertyArray.length; i++)  
 
if (typeof propertyArray[i] === "string") 
 
    delete obj[Object.keys(obj)[i]]         
 
return obj;                      
 
} 
 

 

 

 
var testObject = {size: 6, name: 'String', age: 20} 
 

 
console.log(removeString(testObject))

+0

Он использует много ненужного RESSOURCES. (Получите массив ключей для каждой итерации, которые могут быть дорогими). –

+0

@ibrahimmahrir Я просто использую тот же код, что и OP, поэтому понятно, почему их код не работал и показывает, как его исправить. Да, есть лучшие способы сделать это, но я думаю, что это покажет им самое ясное, что было не так с их исходным кодом. –

+0

Спасибо. Я знаю, что это не лучший способ добиться желаемого результата. Я знал, что близко, но не мог понять, что происходит не так. Я ценю помощь. –

1

Вы вроде есть правильная идея. Одна проблема заключается в том, что вы пытаетесь удалить ключ по индексу. У объектов нет связанного с ними индекса, они неупорядочены. Это означает, что в отличие от списков вы не можете сказать object[index], вместо этого вы говорите object[key].

Что вы хотите сделать, это цикл через каждый ключ, а не значение. Затем вы можете найти это значение и выполнить свое сравнение, а затем вызвать delete с помощью ключа.

function removeString(obj) { 
    var keys = Object.keys(obj); 

    for(var i = 0; i < keys.length; i++) { 
     if (typeof obj[keys[i]] === "string") { 
      delete obj[keys[i]]; 
     } 
    } 

    return obj; 
} 
+0

Спасибо, мне очень нравится альтернатива, которую вы предоставили, а также объяснение, чтобы согласиться с этим. –

0

Object.keys(obj) возвращает массив всех ключей obj (пройти через ключи от объекта и скопировать их (как раз не ключи на значения) в массиве результатов и вернуть его). Поэтому, когда вы набрали delete запись i-th этого массива, obj остается незатронутым. Для того, чтобы объяснить более delete Object.keys(obj)[i] такое же, как:

var aCopyOfTheKeys = Object.keys(obj); // get a copy of all the keys of obj 
delete aCopyOfTheKeys[i]; // remove the i-th property of aCopyOfKeys 

Таким образом, вместо удаления записи из массива, который не имеет ничего общего с obj, вам придется delete свойства obj непосредственно с помощью obj[key] так:

function removeString(obj) { 
 
    // loop through the keys of the object obj 
 
    Object.keys(obj).forEach(function(key) { 
 
     // if the value of this key is of type string 
 
     if (typeof obj[key] === "string") 
 
      // delete it 
 
      delete obj[key]; 
 
    }); 
 
    return obj; 
 
} 
 

 
var testObject = {size: 6, name: 'String', age: 20} 
 

 
console.log(removeString(testObject))

+0

Хотя это хорошая альтернатива, это не объясняет проблему OP. – RobG