0

I'm trying to get a value from multidimensional object with JavaScript. I've tried with .filter, but it appears to be working on arrays only. Also, I almost did it with UnderscoreJS's _where, but it works with non-multidimensional objects only. Is it even possible, or I have to reconstruct my object? I'll be grateful for any hint... Please help :'(

Code (https://jsfiddle.net/ob58fye2/):

<!DOCTYPE html>
<html>
<head>
    <script type="text/javascript">
var configurators = JSON.parse('{"ConfiguredItems":{"OtapiConfiguredItem":[{"Id":"3667395302656","Quantity":"2981","Configurators":{"ValuedConfigurator":[{"@attributes":{"Pid":"1627207","Vid":"3224419"}},{"@attributes":{"Pid":"20509","Vid":"28383"}}]}},{"Id":"3667395302655","Quantity":"4145","Configurators":{"ValuedConfigurator":[{"@attributes":{"Pid":"1627207","Vid":"129819"}},{"@attributes":{"Pid":"20509","Vid":"28383"}}]}},{"Id":"3667395302654","Quantity":"0","Configurators":{"ValuedConfigurator":[{"@attributes":{"Pid":"1627207","Vid":"80557"}},{"@attributes":{"Pid":"20509","Vid":"28383"}}]}}]}}');

function FindConfigurator(pid, vid) {
    var id = null;

    //

    console.log(configurators); // Returns the configurators.
    console.log(id); // Should return `3667395302656`.
}

FindConfigurator(1627207, 3224419);
    </script>
</head>
</html>

1 Answers1

0

You can loop over to your JSON arrays and get the desired result.

var configurators = JSON.parse('{"ConfiguredItems":{"OtapiConfiguredItem":[{"Id":"3667395302656","Quantity":"2981","Configurators":{"ValuedConfigurator":[{"@attributes":{"Pid":"1627207","Vid":"3224419"}},{"@attributes":{"Pid":"20509","Vid":"28383"}}]}},{"Id":"3667395302655","Quantity":"4145","Configurators":{"ValuedConfigurator":[{"@attributes":{"Pid":"1627207","Vid":"129819"}},{"@attributes":{"Pid":"20509","Vid":"28383"}}]}},{"Id":"3667395302654","Quantity":"0","Configurators":{"ValuedConfigurator":[{"@attributes":{"Pid":"1627207","Vid":"80557"}},{"@attributes":{"Pid":"20509","Vid":"28383"}}]}}]}}');

function FindConfigurator(pid, vid) {
    var id = null;
    configurators.ConfiguredItems.OtapiConfiguredItem.forEach(
    (OtapiConfiguredObj)=>{
    OtapiConfiguredObj.Configurators.ValuedConfigurator.forEach(
    (ValuedConfiguratorObj)=>{
    if(ValuedConfiguratorObj['@attributes'].Pid === pid.toString() && ValuedConfiguratorObj['@attributes'].Vid === vid.toString()){
      id = OtapiConfiguredObj.Id;
    }
    });
    });
    console.log(configurators); // Returns the configurators.
    console.log(id); // Should return `3667395302656`.
}

FindConfigurator(1627207, 3224419);

Since, you cannot add a break statement in forEach you can have a general loop to do so, so that when the match is found the loop is broken.

var configurators = JSON.parse('{"ConfiguredItems":{"OtapiConfiguredItem":[{"Id":"3667395302656","Quantity":"2981","Configurators":{"ValuedConfigurator":[{"@attributes":{"Pid":"1627207","Vid":"3224419"}},{"@attributes":{"Pid":"20509","Vid":"28383"}}]}},{"Id":"3667395302655","Quantity":"4145","Configurators":{"ValuedConfigurator":[{"@attributes":{"Pid":"1627207","Vid":"129819"}},{"@attributes":{"Pid":"20509","Vid":"28383"}}]}},{"Id":"3667395302654","Quantity":"0","Configurators":{"ValuedConfigurator":[{"@attributes":{"Pid":"1627207","Vid":"80557"}},{"@attributes":{"Pid":"20509","Vid":"28383"}}]}}]}}');

function FindConfigurator(pid, vid) {
    var id = null;
    for(var i=0; i<configurators.ConfiguredItems.OtapiConfiguredItem.length; i++){
    var OtapiConfiguredObj = configurators.ConfiguredItems.OtapiConfiguredItem[i];
     for(var j=0; j< OtapiConfiguredObj.Configurators.ValuedConfigurator.length; j++) {
      var ValuedConfiguratorObj = OtapiConfiguredObj.Configurators.ValuedConfigurator[j];
      if(ValuedConfiguratorObj['@attributes'].Pid === pid.toString() && ValuedConfiguratorObj['@attributes'].Vid === vid.toString()){
      id = OtapiConfiguredObj.Id;
      break;
      }
     }
     if(id){break;}
    }  
    console.log(configurators); // Returns the configurators.
    console.log(id); // Should return `3667395302656`.
}

FindConfigurator(1627207, 3224419);
Ankit Agarwal
  • 30,378
  • 5
  • 37
  • 62