2017-05-31 5 views
1

私はオブジェクトを持っており、それぞれtheCtns.services.depends_onを通過し、このプロパティの各値をテストする必要があります。値が目標値と等しい場合は削除したい現実には各プロパティを取得して値をテストするにはどうすればよいですか?

var theCtns = { 
 
    "version": "2", 
 
    "networks": { 
 
    "default": { 
 
     "ipam": { 
 
     "config": [ 
 
      { 
 
      "subnet": "0.0.0.0/26", 
 
      "gateway": "0.0.0.0" 
 
      } 
 
     ] 
 
     } 
 
    } 
 
    }, 
 
    "services": { 
 
    "serviceOne": { 
 
     "image": "img1", 
 
     "container_name": "serviceOneName", 
 
     "volumes": [ 
 
     "x:x" 
 
     ], 
 
     "environment": [ 
 
     "SOMETHING=bla", 
 
     "SOMETHINGELSE=bli" 
 
     ], 
 
     "depends_on": [ 
 
     "serviceTwo", 
 
     "serviceX" 
 
     ] 
 
    }, 
 
    "serviceTwo": { 
 
     "image": "img2", 
 
     "container_name": "serviceTwoName", 
 
     "volumes": [ 
 
     "x:x" 
 
     ], 
 
     "environment": [ 
 
     "SOMETHING=bla", 
 
     "SOMETHINGELSE=bli" 
 
     ], 
 
     "depends_on": [ 
 
     "serviceX" 
 
     ] 
 
    } 
 
    } 
 
} 
 

 

 
for (var i= theCtns.services.length-1; i>=0; i--){ 
 
for (var j= theCtns.services[i].depends_on.length-1; j>=0; j--){ 
 
    if (theCtns.services[i].depends_on[j] === "serviceTwo") { 
 
     theCtns.services[i].depends_on.splice(j, 1); 
 
    } 
 
    } 
 
//theCtns.services[i].depends_on = theCtns.services[i].depends_on.filter(x=>x!=="serviceTwo") 
 
} 
 

 

 
console.log(theCtns)

このオブジェクトは、8つの以上のサービスを持つことができますが、2は、だから私のループがeach depends_onその後、each serviceに行くと値をテストする必要があります

私の問題を解決するためにsuffisentされています私のループがどこかで間違っているように見える

[編集]を修正しました3210 typo

+1

jsfiddleを追加できますか? – Abhidev

+0

@Abhidev私はすでにスニペットを提供していますが、私が好きなのは、https://jsfiddle.net/ysjo9cm4/3/ですが、console.logで何も表示されません。 – Jerome

+0

@Rajeshそれは何も変わりません – Jerome

答えて

3

問題はtheCtns.servicesがオブジェクトで、インクリメントループを使用して配列のように反復しようとしています。代わりにfor...inループを使用して、オブジェクトのキーを反復処理する必要があります。

var theCtns = { 
 
    "version": "2", 
 
    "networks": { 
 
    "default": { 
 
     "ipam": { 
 
     "config": [ 
 
      { 
 
      "subnet": "0.0.0.0/26", 
 
      "gateway": "0.0.0.0" 
 
      } 
 
     ] 
 
     } 
 
    } 
 
    }, 
 
    "services": { 
 
    "serviceOne": { 
 
     "image": "img1", 
 
     "container_name": "serviceOneName", 
 
     "volumes": [ 
 
     "x:x" 
 
     ], 
 
     "environment": [ 
 
     "SOMETHING=bla", 
 
     "SOMETHINGELSE=bli" 
 
     ], 
 
     "depends_on": [ 
 
     "serviceTwo", 
 
     "serviceX" 
 
     ] 
 
    }, 
 
    "serviceTwo": { 
 
     "image": "img2", 
 
     "container_name": "serviceTwoName", 
 
     "volumes": [ 
 
     "x:x" 
 
     ], 
 
     "environment": [ 
 
     "SOMETHING=bla", 
 
     "SOMETHINGELSE=bli" 
 
     ], 
 
     "depends_on": [ 
 
     "serviceX" 
 
     ] 
 
    } 
 
    } 
 
} 
 

 

 
for (var i in theCtns.services){ 
 
    if(theCtns.services.hasOwnProperty(i)){ 
 
     for (var j= theCtns.services[i].depends_on.length-1; j>=0; j--){ 
 
     if (theCtns.services[i].depends_on[j] === "serviceTwo") { 
 
      theCtns.services[i].depends_on.splice(j, 1); 
 
     } 
 
     } 
 
    } 
 
} 
 

 

 
console.log(theCtns)

+0

うわー、大丈夫です私のエラーを見てください。素敵な入力ありがとうございます – Jerome

1

theCtns.servicesArrayではなく、あなたはそれが一つであったかのように、それを反復処理しようとしています。実際にはObjectです。 Objectには長さがないため、ループが間違っていたのです。また、theCtns.services[i]は、存在しないtheCtns.services[0]などの値を参照していたため、間違っていました。 iがオブジェクトの実際のキーから値を取得するようにコードを変更しました。

var theCtns = { 
 
    "version": "2", 
 
    "networks": { 
 
    "default": { 
 
     "ipam": { 
 
     "config": [ 
 
      { 
 
      "subnet": "0.0.0.0/26", 
 
      "gateway": "0.0.0.0" 
 
      } 
 
     ] 
 
     } 
 
    } 
 
    }, 
 
    "services": { 
 
    "serviceOne": { 
 
     "image": "img1", 
 
     "container_name": "serviceOneName", 
 
     "volumes": [ 
 
     "x:x" 
 
     ], 
 
     "environment": [ 
 
     "SOMETHING=bla", 
 
     "SOMETHINGELSE=bli" 
 
     ], 
 
     "depends_on": [ 
 
     "serviceTwo", 
 
     "serviceX" 
 
     ] 
 
    }, 
 
    "serviceTwo": { 
 
     "image": "img2", 
 
     "container_name": "serviceTwoName", 
 
     "volumes": [ 
 
     "x:x" 
 
     ], 
 
     "environment": [ 
 
     "SOMETHING=bla", 
 
     "SOMETHINGELSE=bli" 
 
     ], 
 
     "depends_on": [ 
 
     "serviceX" 
 
     ] 
 
    } 
 
    } 
 
} 
 

 

 
for (var i in theCtns.services){ 
 
    console.log(i); 
 
    for (var j= theCtns.services[i].depends_on.length-1; j>=0; j--){ 
 
    if (theCtns.services[i].depends_on[j] === "serviceTwo") { 
 
     theCtns.services[i].depends_on.splice(j, 1); 
 
    } 
 
    } 
 
} 
 

 

 
console.log(theCtns)

+1

@MrCodeと同じですが、入力にも感謝しています。 – Jerome

1

変更されたコードを確認し、それは、配列が、目的ではないのですから、あなたは... VAR使用する必要があります。また、配列メソッドを直接使用して、depends_onフィールドでターゲット値を見つけることもできます。

var theCtns = { 
     "version": "2", 
     "networks": { 
     "default": { 
      "ipam": { 
      "config": [ 
       { 
       "subnet": "0.0.0.0/26", 
       "gateway": "0.0.0.0" 
       } 
      ] 
      } 
     } 
     }, 
     "services": { 
     "serviceOne": { 
      "image": "img1", 
      "container_name": "serviceOneName", 
      "volumes": [ 
      "x:x" 
      ], 
      "environment": [ 
      "SOMETHING=bla", 
      "SOMETHINGELSE=bli" 
      ], 
      "depends_on": [ 
      "serviceTwo", 
      "serviceX" 
      ] 
     }, 
     "serviceTwo": { 
      "image": "img2", 
      "container_name": "serviceTwoName", 
      "volumes": [ 
      "x:x" 
      ], 
      "environment": [ 
      "SOMETHING=bla", 
      "SOMETHINGELSE=bli" 
      ], 
      "depends_on": [ 
      "serviceX" 
      ] 
     } 
     } 
    } 

    for (var idx in theCtns.services) { 
     var deps_idx = 
     theCtns.services[idx].depends_on.indexOf('serviceTwo'); 
     if (deps_idx) { 
      theCtns.services[idx].depends_on.splice(idx, 1); 
     } 
    } 
    console.log(theCtns.services); 
+0

私は@MrCodeのソリューションを使用しましたが、私の問題を解決するために時間を割いてくれてありがとう – Jerome

関連する問題