如果一个对象的键包含一个词

If key of a object contains a word

我有这样一个对象:

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

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

我知道我可以使用 data.result['Price/STK'] 等方法获取值,但我不想检查每个键,我想搜索价格只需使用。

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

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

您可以创建一个方便的函数:

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

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

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

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

过滤结果数组对象上的键集 "Price",然后 return 与之关联的值。我为它做了一个函数作为例子。

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));

您可以使用 Object.keys 获取对象的 属性 名称,然后使用 indexOf搜索一个值,但它进行精确匹配并且不将正则表达式作为参数。

所以你必须遍历所有 属性 个名字,直到找到你想要的那个。内置迭代器可以提供帮助:

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;
}