我有一个像这样的对象:
{"status":200,
"success":true,
"result": [ {"Description":"", "Year":"", "Price/STK":"", "Main Cat":"Fruits"} ]
}
我有需要使用的不同列表,价格键可以是:价格/ STK,价格/盒子,价格/ Btl或价格。
我知道我可以使用例如data.result ['Price / STK']来获取值,但我不想检查每个键,我想搜索价格并且只是使用。
我如何确定一个单词(例如'Price *')是否是某个键的一部分并获得该值?
答案 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"
答案 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));