我正在使用API,我正在使用details[5].Value
以下列格式定位信息:
details:
"value":[
{
"ID": "6",
"Name": "Links",
"Value": "URL"
},
{
"ID": "7",
"Name": "Other",
"Value": "URL"
}
etc
]
问题是JSON响应中的位置可能会在将来发生变化,使我的代码过时,并且由于url也有可能发生变化,我无法将其作为目标。
我想要一种方法来定位url的值,主要是因为这个,"Name"
属性的值。但是,如果我使用像
_.where(details, { Name: "Links" }).Value
它以未定义的形式返回。我不确定是否会有其他方法来获取信息?
答案 0 :(得分:2)
这里有几点混淆。
_.where
返回一个数组:
查看列表中的每个值,返回包含属性中列出的所有键值对的所有值的数组。
所以你的_.where(details, obj).Value
(几乎)总是会给你undefined
,因为数组不太可能有Value
属性。另一方面,_.findWhere
确实返回一个值:
浏览列表并返回与属性中列出的所有键值对匹配的第一个值。
其次,您的details
似乎如下:
let details = {
value: [
{ ID: '6', Name: 'Links', Value: 'URL' },
{ ID: '7', Name: 'Other', Value: 'URL' },
...
]
}
因此您不想搜索details
,而是想搜索details.value
。
将它们放在一起:
_(details.value).findWhere({ Name: 'Links' }).Value
或
_.findWhere(details.value, { Name: 'Links' }).Value
您可以使用Array.prototype.find
(或Array.prototype.filter
如果您要查找所有匹配项)并编写自己的回调但您已经拥有可用的Underscore,那么为什么要这么麻烦?此外,Backbone集合具有findWhere
和where
方法,并且匹配Backbone的整体术语具有优势。
答案 1 :(得分:0)
看看这个迷你功能。如果出现问题,请告诉我
这是ES5版本
function f(key, value, array){
return array.value.filter(function(sub_array){
return sub_array[key] == value;
});
}
这是ES6高尔夫版本
f=(k,v,a)=>a.value.filter(_=>_[k]==v)
//This is your JSON
var details = {
value: [
{
"ID": "6",
"Name": "Links",
"Value": "URL"
},
{
"ID": "7",
"Name": "Other",
"Value": "URL"
}
]
}
// Short code
f=(k,v,a)=>a.value.filter(_=>_[k]==v)
// f is the function name
// Recives k = array key, v = value, a = array
// filter by the given key and value
// return the result as an array
console.log(f('Name', 'Links', details))

答案 2 :(得分:0)
另一种方法是使用Javascript内置函数 find
来获取数组中的特定对象。
byThis
参数是一个对象,则整个key-values
集必须与目标数组中每个对象的key-values
匹配。byThis
是一个字符串,则每个对象都将被视为字符串以进行必要的比较。
let details = { "value": [{ "ID": "6", "Name": "Links", "Value": "URL" }, { "ID": "7", "Name": "Other", "Value": "URL" }]};
let findBy = (array, byThis) => {
return array.find(o => {
if (typeof byThis === 'object') return Object.keys(byThis).every(k => o[k] === byThis[k]);
else if (typeof byThis === 'string') return o.toString() === byThis;
});
}
let found = findBy(details.value, {Name: "Links"});
console.log(found);
.as-console-wrapper { max-height: 100% !important; top: 0; }