如何按值在 JS 集合中查找对象
How to find an object within a JS collection by value
我现在正在使用 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
它返回未定义。我不确定是否有其他方式获取信息?
看看这个迷你功能。如果有问题请告诉我
更新
这是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))
另一种方法是使用 Javascript built-in 函数 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; }
这里有几点混淆。
_.where
return一个数组:
Looks through each value in the list, returning an array of all the values that contain all of the key-value pairs listed in properties.
所以你的 _.where(details, obj).Value
将(几乎)总是给你 undefined
因为数组不太可能有 Value
属性。另一方面,_.findWhere
return 有一个值:
Looks through the list and returns the first value that matches all of the key-value pairs listed in properties.
其次,您的 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
(or Array.prototype.filter
)并编写您自己的回调,但您已经可以使用 Underscore 了,何必呢?此外,Backbone 集合有 findWhere
和 where
方法,匹配 Backbone 的整体术语有优势。
我现在正在使用 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
它返回未定义。我不确定是否有其他方式获取信息?
看看这个迷你功能。如果有问题请告诉我
更新
这是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))
另一种方法是使用 Javascript built-in 函数 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; }
这里有几点混淆。
_.where
return一个数组:
Looks through each value in the list, returning an array of all the values that contain all of the key-value pairs listed in properties.
所以你的 _.where(details, obj).Value
将(几乎)总是给你 undefined
因为数组不太可能有 Value
属性。另一方面,_.findWhere
return 有一个值:
Looks through the list and returns the first value that matches all of the key-value pairs listed in properties.
其次,您的 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
(or Array.prototype.filter
)并编写您自己的回调,但您已经可以使用 Underscore 了,何必呢?此外,Backbone 集合有 findWhere
和 where
方法,匹配 Backbone 的整体术语有优势。