获取属性的javascript Object属性

时间:2017-08-29 08:59:30

标签: javascript arrays javascript-objects

我有一个JS对象可能看起来像下列之一:

// Example #1:
var data = {
    product: {
        value1: 'v1',
        value2: 2
    }
}
// Example #2:    
var data = {
    order: {
        value1: 1
    }
}
// Example #3:    
var data = {
    value1: 1
}

我想要实现的目标:

var inputName = 'product[value1]';
var data = {
    product: {
        value1: 'v1',
        value2: 2
    }
}
var value = something(data, inputName); // should return v1

inputName和data可以更改,我可以使用带有input {'product[value2]''order[value1]''value1'的任何上述数据对象。

我的猜测是使用正则表达式并获取两个属性名称。这是更好的方式吗?

4 个答案:

答案 0 :(得分:1)

你可以使用下划线js _.each迭代对象,如

_.each(data ,function(product){
    console.log(product.value);
});

请参阅链接:http://underscorejs.org/#each

你也可以用于每个循环。

您也可以执行以下过滤:

_.filter(data, function(product){
    return product.value;
 });

答案 1 :(得分:0)

解释

如果要为函数提供类似'product[value1]'的字符串作为参数,则需要获取查询结果值所需的所有属性值。我用query.replace(/(\[)|(\])/g, ' ')split(' ')做到了。返回的数组需要检查空字符串并将其删除。我是用filter做的 之后,您只需在返回的数组上使用reduce即可在每次迭代时获得新值。在最后一次迭代中,您得到了结果。

代码

function getDataValue(obj, query) {
    var attributes = getAttributeNames(query)
    return attributes.reduce(function(value, current) { 
        return value[current]
    }, obj)
}

function getAttributeNames(query) {
    return query.replace(/(\[)|(\])/g, ' ')
        .split(' ')
        .filter(function(string) {
            return string.length > 0
        })
}

实施例

var dataOne = {
    product: {
        value1: 'v1',
        value2: 2
    }
}

var dataTwo = {
    product: {
        subProduct: {
          value1: 'v2'
        }
    }
}

console.log(getDataValue(dataOne, 'product[value1]'))
console.log(getDataValue(dataTwo, 'product[subProduct][value1]'))


function getDataValue(obj, query) {
    var attributes = getAttributeNames(query)
    return attributes.reduce(function(value, current) { 
      return value[current]
    }, obj)
}

function getAttributeNames(query) {
    return query.replace(/(\[)|(\])/g, ' ')
      .split(' ')
      .filter(function(string) {
        return string.length > 0
      })
}

答案 2 :(得分:0)

另一种方法是创建一个直接迎合搜索的字典。

您可以展平多级键值对,以创建可以轻松使用的词典。下面的flatten函数(taken from here)创建了一个字典,如:

{
  "product.value1": "v1",
  "product.value2": 2
}

然后,您可以使用dictionary["product.value1"]

进行查询

如果您愿意,可以更改此展平功能以格式化product[value1]等键。

var data = {
    product: {
        value1: 'v1',
        value2: 2
    }
}
var myDictionary = flatten(data);

console.log(myDictionary);
console.log(myDictionary["product.value1"]);
console.log(myDictionary["product.something else"]);


function flatten(obj, opt_out, opt_paths) {
  var out = opt_out || {};
  var paths = opt_paths || [];
  return Object.getOwnPropertyNames(obj).reduce(function(out, key) {
    paths.push(key);
    if (typeof obj[key] === 'object') {
      flatten(obj[key], out, paths);  
    } else {
      out[paths.join('.')] = obj[key];
    }
    paths.pop();
    return out;
  }, out)
}

答案 3 :(得分:0)

如果您知道可能的属性名称,那么我将定义一个带有可能属性名称的数组,然后迭代它们检查是否有一个具有此名称的字段

const names = [
  'product',
  'order'
];

function findValue(data){
  if(data.value1) return data.value1;
  for(let name in names){
    if(data[name].value1) return data[name].value1;
  }
}