如果一个对象的键包含一个词
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"
您可以使用 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;
}
我有这样一个对象:
{"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"
您可以使用 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;
}