[英]Loop through array inside a value JavaScript object
我有一個 Javascript 項目,在該項目中,我試圖遍歷一個在屬性中作為值找到的數組,以獲取鍵並從該鍵中從另一個對象獲取其值。
現在我只能獲取只包含一個值的屬性的鍵,我需要獲取以數組為值的屬性的鍵。
這是輸入值:
let asset = "test";
這是我需要獲取上述值所屬的鍵的第一個對象:
let testData = {
"data1": ["CAR,PLANE"],
"data2":["COUNTRY,CITY"],
"data3":"TEST"
};
這是第二個對象,我必須根據前一個鍵從中獲取值:
let dataObj = {
"data1": [
"t1Data1",
"t2Data1",
"t3Data1"
],
"data2": [
"t1Data2",
"t2Data2",
"t3Data2"
],
"data3": [
"t1Data3",
"t2Data3",
"t3Data3"
]
};
這就是我獲取密鑰的方法:
let res = Object.keys(testData).find(key => testData[key] === asset.toUpperCase());
這是當值是單個字符串時它返回的內容:
data3
這是當值在數組中時返回的內容(let asset = "car";)
:
undefined
這就是我需要的:
data1
這就是我遍歷數組的方法:
for(let getData of testData.data1) {
console.log(getData)
}
獲取密鑰時我需要遍歷數組,但我不知道如何將其包含在 res 變量中。
您可以將字符串值轉換為數組,同時保持數組值不變,然后使用Array#includes
和Array#find
方法,如下所示:
const asset = "test", dataObj = { "data1": ["CAR","TRUCK","TRAIN"], "data2": ["PLANT","TREE","SEEDLING"], "data3": "TEST" }, output = (o,k) => (Object.entries(o).find( ([key,value]) => [].concat(...[value]).includes(k.toUpperCase()) ) || ['NOT FOUND'])[0]; console.log( output(dataObj,asset) ); console.log( output(dataObj,"car") ); console.log( output(dataObj,"skooter") );
也許你可以嘗試這樣的事情?
let res = Object.keys(testData).find(key => typeof testData[key] === 'object' ? testData[key].includes(asset.toUpperCase()) : testData[key] === asset.toUpperCase());
下面介紹的是實現預期目標的一種可能方式。
代碼片段
// method to find the key const findKeyFor = (val, obj) => ( // iterate over key-value pairs of given object 'obj' Object.entries(obj) // find key-value pair where // value matches the "asset" .find(([k, v]) => [v].flat().some( // [v].flat() accounts for value in "testData" // being either string or array of string elt => elt.split(',').some( // "elt.split()" accounts for string separated // by comma such as "CAR,PLANE" w => w === val.toUpperCase() ) )) ?.[0] // extract only the "key" ?? 'not found' // if not found, ); const testData = { "data1": ["CAR,PLANE"], "data2":["COUNTRY,CITY"], "data3":"TEST" }; let asset1 = 'test'; let asset2 = 'car'; console.log( 'find key for "test": ', findKeyFor(asset1, testData) ); console.log( 'find key for "car": ', findKeyFor(asset2, testData) ); let dataObj = { "data1": [ "t1Data1", "t2Data1", "t3Data1" ], "data2": [ "t1Data2", "t2Data2", "t3Data2" ], "data3": [ "t1Data3", "t2Data3", "t3Data3" ] }; // to get the value from "dataObj" using the above method console.log( 'get dataObj array for "test": ', dataObj?.[findKeyFor('test', testData)] ); console.log( 'get dataObj array for "car": ', dataObj?.[findKeyFor('car', testData)] );
.as-console-wrapper { max-height: 100% !important; top: 0 }
解釋
添加到上述代碼段的內聯注釋。
您需要遍歷數組中的每個項目:
let dataObj = { data1: ['t1Data1', 't2Data1', 't3Data1'], data2: ['t1Data2', 't2Data2', 't3Data2'], data3: ['t1Data3', 't2Data3', 't3Data3'], }; let testData = { data1: ['CAR,PLANE'], data2: ['COUNTRY,CITY'], data3: 'TEST', }; let asset = 'car'; let res = Object.keys(testData).find(key => { const value = testData[key] if (Array.isArray(value)) { // Go through each item in the array and compare return value.some(item => item.toLowerCase().includes(asset)) } return value.toLowerCase().includes(asset) }) console.log(res);
data1
的值為["CAR,PLANE"]
。 數組中的單個元素。 您的邏輯假設“CAR”和“PLANE”是數組的 2 個單獨的字符串元素。 您可以將代碼更改為以下內容(假設數組中始終只有一個元素)。
let dataObj = {
data1: ['t1Data1', 't2Data1', 't3Data1'],
data2: ['t1Data2', 't2Data2', 't3Data2'],
data3: ['t1Data3', 't2Data3', 't3Data3'],
};
let testData = {
data1: ['CAR,PLANE'],
data2: ['COUNTRY,CITY'],
data3: 'TEST',
};
let asset = 'car';
let res = Object.keys(testData).find((key) =>
typeof testData[key] === 'object'
? testData[key][0].includes(asset.toUpperCase())
: testData[key] === asset.toUpperCase()
);
console.log(res);
注意[0]
中的? testData[key][0].includes(asset.toUpperCase())
? testData[key][0].includes(asset.toUpperCase())
。
如果您的示例錯誤並且["CAR,PLANE"]
應該真的是["CAR", "PLANE"]
,我相信您的代碼應該可以工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.