2017-02-05 7 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 Object.keys(obj)[i]以外

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

。今すぐnamenameがのobj["name"]であるのではなく、検索された値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

あなたは一種の正しい考えを持っています。 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のすべてのキーの配列を返します(オブジェクトのキーを通過し、結果配列にそれら(ちょうどキーではない値)をコピーし、それを返す)します。だからdeletei-thその配列のエントリ、objは影響を受けません。

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とは何の関係もありません、配列のエントリを削除する、あなたはobjの性質が直接このようなobj[key]を使用してdeleteする必要があります:delete Object.keys(obj)[i]以上を説明することは同じです

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

関連する問題