Javascript 如何按值查找JS集合中的对象

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": "

我现在正在使用API,并使用
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

把它们放在一起: