[英]find an array based on its property array of object
我試圖根據 object 數組的元素 id 獲取一個數組,結構看起來像這樣
{"data": [
{
"id": 46,
"name": "shsjks",
"desc": "ehejej",
"code": "hshsbsb",
"activation_type": 1,
"detail": "[{\"id\": 413, \"name\": \"A\"}, {\"id\": 416, \"name\": \"B\"}]",
},
{
"id": 47,
"name": "hhksns",
"desc": "benemne",
"code": "gevewk",
"activation_type": 1,
"detail": "[{\"id\": 419, \"name\": \"C\"}, {\"id\": 423, \"name\": \"D\"}]"
},
]}
我試圖根據詳細信息 id 和我做了什么來獲取數據
let arr = a.data.filter(x => {
return (JSON.parse(x.detail).filter(x => x.id === 419))
});
// returned all instead of first element of the array
我希望它返回
// filter where id 419
{
"id": 47,
"name": "shjks",
"detail": "[{\"id\": 419, \"name\": \"C\"}, {\"id\": 423, \"name\": \"D\"}]"
....
}
.filter
不會執行 map。 其回調 function 的返回值應該只是指示是否應包含數組元素(來自頂級數組)。 因此,當您不希望包含數組時,您應該返回一個虛假值。 由於.some
返回 boolean,這是用於該目的的完美候選方法。 如果您希望只有一個匹配項,那么.find
比.filter
更合適:
let a = {"data": [{"id": 46,"name": "shsjks","desc": "ehejej","code": "hshsbsb","activation_type": 1,"detail": "[{\"id\": 413, \"name\": \"A\"}, {\"id\": 416, \"name\": \"B\"}]",},{"id": 47,"name": "hhksns","desc": "benemne","code": "gevewk","activation_type": 1,"detail": "[{\"id\": 419, \"name\": \"C\"}, {\"id\": 423, \"name\": \"D\"}]"},]} let result = a.data.find(x => JSON.parse(x.detail).some(x => x.id === 419)); console.log(result);
如果您希望details
在結果中保持解析,則首先執行map
:
let a = {"data": [{"id": 46,"name": "shsjks","desc": "ehejej","code": "hshsbsb","activation_type": 1,"detail": "[{\"id\": 413, \"name\": \"A\"}, {\"id\": 416, \"name\": \"B\"}]",},{"id": 47,"name": "hhksns","desc": "benemne","code": "gevewk","activation_type": 1,"detail": "[{\"id\": 419, \"name\": \"C\"}, {\"id\": 423, \"name\": \"D\"}]"},]} let result = a.data.map(x => ({...x, detail: JSON.parse(x.detail)})).find(x => x.detail.some(x => x.id === 419)); console.log(result);
如果您只對id
鍵本身感興趣,則執行.flatMap
以首先收集所有已解析的detail
arrays,這樣您將獲得一個包含所有詳細信息的數組,然后.find
您需要的元素:
let a = {"data": [{"id": 46,"name": "shsjks","desc": "ehejej","code": "hshsbsb","activation_type": 1,"detail": "[{\"id\": 413, \"name\": \"A\"}, {\"id\": 416, \"name\": \"B\"}]",},{"id": 47,"name": "hhksns","desc": "benemne","code": "gevewk","activation_type": 1,"detail": "[{\"id\": 419, \"name\": \"C\"}, {\"id\": 423, \"name\": \"D\"}]"},]} let result = a.data.flatMap(x => JSON.parse(x.detail)).find(x => x.id === 419); console.log(result);
你應該做這樣的事情。
let arr = a.data.filter(x => {
return (JSON.parse(x.detail).filter(x => x.id === 419).length)
});
如果不存在值,則 Array.filter 返回[]
。 因此,當您返回數組本身時,它永遠不會被視為錯誤。
您的代碼中的問題是第一個過濾器需要返回 boolean 值(過濾器與否)
這對你有用:
const test = { data: [ { id: 46, name: 'shsjks', desc: 'ehejej', code: 'hshsbsb', activation_type: 1, detail: '[{"id": 413, "name": "A"}, {"id": 416, "name": "B"}]', }, { id: 47, name: 'hhksns', desc: 'benemne', code: 'gevewk', activation_type: 1, detail: '[{"id": 419, "name": "C"}, {"id": 423, "name": "D"}]', }, ], }; const arr = test.data.find((x) => JSON.parse(x.detail).some((d) => d.id === 419)); console.log(JSON.stringify(arr, null, 2));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.