Javascript 如何按值查找JS集合中的对象
我现在正在使用API,并使用Javascript 如何按值查找JS集合中的对象,javascript,backbone.js,underscore.js,Javascript,Backbone.js,Underscore.js,我现在正在使用API,并使用details[5].Value以以下格式定位信息: details: "value":[ { "ID": "6", "Name": "Links", "Value": "URL" }, { "ID": "7", "Name": "Other", "Value": "
details[5].Value
以以下格式定位信息:
details:
"value":[
{
"ID": "6",
"Name": "Links",
"Value": "URL"
},
{
"ID": "7",
"Name": "Other",
"Value": "URL"
}
etc
]
问题是JSON响应中的位置将来可能会改变,使我的代码过时,而且由于url也有可能改变,因此我无法针对这一点
我想找到一种方法,主要是通过“Name”
属性的值来确定url的值。但是,如果我使用
_.where(details, { Name: "Links" }).Value
它返回为未定义。我不确定是否有其他方法获取信息?请查看此迷你功能。如果有什么问题,请告诉我 更新 这是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)
//这是您的JSON
变量详细信息={
价值:[
{
“ID”:“6”,
“名称”:“链接”,
“值”:“URL”
},
{
“ID”:“7”,
“名称”:“其他”,
“值”:“URL”
}
]
}
//短代码
f=(k,v,a)=>a.value.filter(=>_k]==v)
//f是函数名
//接收k=数组键,v=值,a=数组
//按给定的键和值进行筛选
//以数组形式返回结果
log(f('Name','Links',details))
看看这个小函数。如果有什么问题,请告诉我
更新
这是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)
//这是您的JSON
变量详细信息={
价值:[
{
“ID”:“6”,
“名称”:“链接”,
“值”:“URL”
},
{
“ID”:“7”,
“名称”:“其他”,
“值”:“URL”
}
]
}
//短代码
f=(k,v,a)=>a.value.filter(=>_k]==v)
//f是函数名
//接收k=数组键,v=值,a=数组
//按给定的键和值进行筛选
//以数组形式返回结果
log(f('Name','Links',details))
另一种方法是使用Javascript内置函数获取数组中的特定对象
- 此选项允许您传递对象或字符串
- 如果
参数是一个对象,则整个byThis
键值集必须与目标数组中每个对象的
键值匹配
- 否则,如果此是字符串,则每个对象都将被视为字符串,以进行必要的比较
let details={“value”:[{“ID”:“6”,“Name”:“Links”,“value”:“URL”},{“ID”:“7”,“Name”:“Other”,“value”:“URL”}]};
让findBy=(数组,byThis)=>{
返回数组。查找(o=>{
if(typeof byThis==='object')返回object.keys(byThis.every)(k=>o[k]==byThis[k]);
else if(typeof byThis=='string')返回o.toString()==byThis;
});
}
let found=findBy(details.value,{Name:“Links”});
console.log(找到)代码>
.as控制台包装{max height:100%!important;top:0;}
另一种方法是使用Javascript内置函数获取数组中的特定对象
- 此选项允许您传递对象或字符串
- 如果
byThis
参数是一个对象,则整个键值集必须与目标数组中每个对象的键值匹配
- 否则,如果此
是字符串,则每个对象都将被视为字符串,以进行必要的比较
let details={“value”:[{“ID”:“6”,“Name”:“Links”,“value”:“URL”},{“ID”:“7”,“Name”:“Other”,“value”:“URL”}]};
让findBy=(数组,byThis)=>{
返回数组。查找(o=>{
if(typeof byThis==='object')返回object.keys(byThis.every)(k=>o[k]==byThis[k]);
else if(typeof byThis=='string')返回o.toString()==byThis;
});
}
let found=findBy(details.value,{Name:“Links”});
console.log(找到)代码>
.as控制台包装{max height:100%!important;top:0;}
这里有几个混淆点
返回一个数组:
查看列表中的每个值,返回包含属性中列出的所有键值对的所有值的数组
因此,您的\uuwhere(details,obj).Value
将(几乎)始终为您提供未定义的,因为数组不太可能具有Value
属性。另一方面,不返回单个值:
查看列表并返回与属性中列出的所有键值对匹配的第一个值
其次,您的详细信息看起来像:
let details = {
value: [
{ ID: '6', Name: 'Links', Value: 'URL' },
{ ID: '7', Name: 'Other', Value: 'URL' },
...
]
}
因此,您不希望搜索详细信息
,而是希望搜索详细信息.value
把它们放在一起:
_(details.value).findWhere({ Name: 'Links' }).Value
或
您可以使用(或者如果您正在查找所有匹配项)并编写自己的回调,但您已经有下划线可用,那么为什么还要麻烦呢?此外,主干集合有findWhere
和where
方法,匹配主干的整体术语有很多优点。这里有几个混淆点
返回一个数组:
查看列表中的每个值,返回包含属性中列出的所有键值对的所有值的数组
因此,您的\uuwhere(details,obj).Value
将(几乎)始终为您提供未定义的,因为数组不太可能具有Value
属性。另一方面,不返回单个值:
查看列表并返回与属性中列出的所有键值对匹配的第一个值
其次,您的详细信息看起来像:
let details = {
value: [
{ ID: '6', Name: 'Links', Value: 'URL' },
{ ID: '7', Name: 'Other', Value: 'URL' },
...
]
}
因此,您不希望搜索详细信息
,而是希望搜索详细信息.value
把它们放在一起: