Skip to content Skip to sidebar Skip to footer

Javascript: How To Get Object Property Using Array Of String?

How do i get object property using array of string (name of properties)? (the last element in array is the inner property of object) See the code below: Handy way: let myObject = {

Solution 1:

You can use .reduce():

let myObject = {
  "property": {
    "subproperty": {
      "targetproperty": "Hi, We done it!"
    }
  }
};
let myString = "property:subproperty:targetproperty";
let value = myString.split(":").reduce(function(obj, prop) {
  return obj && obj[prop];
}, myObject);

console.log(value);

Solution 2:

For loop:

function getByValue(arr, value) {

  for (var i=0, iLen=arr.length; i<iLen; i++) {

    if (arr[i].b == value) return arr[i];
  }
}

.filter

functiongetByValue2(arr, value) {

  var result  = arr.filter(function(o){return o.b == value;} );

  return result? result[0] : null; // or undefined

}

.forEach

functiongetByValue3(arr, value) {

  var result = [];

  arr.forEach(function(o){if (o.b == value) result.push(o);} );

  return result? result[0] : null; // or undefined

}

If, on the other hand you really did mean for..in and want to find an object with any property with a value of 6, then you must use for..in unless you pass the names to check. e.g.

functiongetByValue4(arr, value) {
  var o;

  for (var i=0, iLen=arr.length; i<iLen; i++) {
    o = arr[i];

    for (var p in o) {
      if (o.hasOwnProperty(p) && o[p] == value) {
        return o;
      }
    }
  }
}

Solution 3:

The recursive way ;)

Create a function that takes the current property, allparts and index.

Start with zero, return call to next index, try read and return with next call and increment index untill there are no more props to read/extract then return the value you got as the current property.

Let me know if you need working code

Solution 4:

Here is a recursive approach, it will return undefined if the property isn't found:

constgetPath = (o, keyPath, delimiter = '.') => {
    if (Array.isArray(keyPath)) {
        keyPath = keyPath.join(delimiter)
    }
  // o might not be an object when called recursivelyif(Object(o) === o) {
    let keys = keyPath.split(delimiter);
    let key  = keys.shift();

    if(o.hasOwnProperty(key)) {
      if(keys.length) {
        // there are more keys to check, call with attribute and remaining keysreturngetPath(o[key], keys.join(delimiter), delimiter);
      } else {
        // no more keys to check and object does have propertyreturn o[key];
      }
    }
    // didn't early return from having the key above, object does not have propertyreturnundefined;
  } elseif(keyPath.length === 0) { 
    // o is not an object, but there is no remaining keyPath, so we will assume we've unwound the stackreturn o;
  }
  // not an object and keyLength is non-zero, object does not contain propertyreturnundefined;
};

let myObject = {
    "property": {
        "subproperty": {
            "targetproperty": "Hi, We done it!"
        }
    }
};

console.log(getPath(myObject, "property:subproperty:targetproperty", ":"));

Solution 5:

You can loop through your parts array, accessing the value of each key in each iteration.

functionvalueFromPath(obj, path) {
  for (var i = 0; i < path.length; ++i) {
    obj = obj[path[i]];
  }

  return obj;
};

valueFromPath(myObject, parts);

You probably want to clone the object first, in case you are going to use it for something else.


Alternatively, you can use traverse. Specifically traverse#getpath.

traverse(myObject).get(parts);

Post a Comment for "Javascript: How To Get Object Property Using Array Of String?"