如果对象的键包含单词

时间:2015-10-21 22:32:54

标签: javascript arrays javascript-objects

我有一个像这样的对象:

{"status":200, 
"success":true, 
"result": [ {"Description":"", "Year":"", "Price/STK":"", "Main Cat":"Fruits"} ]
}

我有需要使用的不同列表,价格键可以是:价格/ STK,价格/盒子,价格/ Btl或价格。

我知道我可以使用例如data.result ['Price / STK']来获取值,但我不想检查每个键,我想搜索价格并且只是使用。

我如何确定一个单词(例如'Price *')是否是某个键的一部分并获得该值?

4 个答案:

答案 0 :(得分:6)

没有内置方法可以执行此操作,您必须迭代并检查每个键。

您可以创建一个方便的功能:

function matchKey(objectToSearch, keyToFind) {
    for (var k in objectToSearch) {
        if ( k.toLowerCase().indexOf(keyToFind.toLowerCase()) !== -1) 
            return objectToSearch[k];
    }
    return null;
}

matchKey({year : 2015, "Price/STK" : "value"}, "price"); // returns "value"

FIDDLE

答案 1 :(得分:2)

您可以使用lodash(或下划线)轻松解决此问题

_.findKey(obj, function(key) { return _.startsWith(key, 'Price')})

这会找到以price开头的第一个键。

答案 2 :(得分:2)

您可以使用 Object.keys 获取对象的属性名称,然后使用 indexOf 来搜索值,但它会完全匹配并且不会t将正则表达式作为参数。

因此,您必须遍历所有属性名称,直到找到所需的属性名称。有内置的迭代器可以提供帮助:

var obj = {"status":200, 
  "success":true, 
  "result": [ {"Description":"desc", 
               "Year":"yr", 
               "Price/STK":"price/stk",
               "Main   Cat":"Fruits"}
            ]
};

function getValueLike(obj, prop){
  var re = new RegExp('^' + prop);
  var value;
  Object.keys(obj).some(function(prop) {
    if (re.test(prop)) {
      value = obj[prop];
      return true;
    }
  });
  return value;
}

document.write(getValueLike(obj.result[0], 'Price')); // price/stk

在属性名称上使用 indexOf 的版本可能更快,代码更少:

function getValueLike(obj, prop){
  var value;
  Object.keys(obj).some(function(key) {
    if (key.indexOf(prop) == 0) {
      value = obj[key];
      return true;
    }
  });
  return value;
}

可以简化为:

function getValueLike(obj, prop, value){
  Object.keys(obj).some(function(key) {return key.indexOf(prop) == 0 && ((value = obj[key]) || true)});
  return value;
}

还允许将默认值传递给 value ,但对我来说这有点过于模糊。

使用箭头功能:

function getValueLike(obj, prop, value){
  Object.keys(obj).some(key => key.indexOf(prop) == 0 && ((value = obj[key]) || true));
  return value;
}

答案 3 :(得分:0)

过滤结果数组对象上的“价格”对象组,然后返回与之关联的值。我为它做了一个函数作为一个例子。

function selectPrice(obj){
  return obj.result[0][
      Object.keys(obj.result[0]).filter(function(el){ 
          return el.indexOf("Price") > -1 
      })[0]
  ]
}

var data = {"status":200, 
"success":true, 
"result": [ {"Description":"", "Year":"", "Price/STK":"6", "Main Cat":"Fruits"} ]
};

document.write(selectPrice(data));