我有一個 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 變數中。
uj5u.com熱心網友回復:
您可以將字串值轉換為陣列,同時保持陣列值不變,然后使用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") );
uj5u.com熱心網友回復:
您需要遍歷陣列中的每個專案:
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);
uj5u.com熱心網友回復:
也許你可以嘗試這樣的事情?
let res = Object.keys(testData).find(key => typeof testData[key] === 'object' ? testData[key].includes(asset.toUpperCase()) : testData[key] === asset.toUpperCase());
uj5u.com熱心網友回復:
的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]in ? testData[key][0].includes(asset.toUpperCase())。
如果您的示例錯誤并且["CAR,PLANE"]確實應該是錯誤["CAR", "PLANE"]的,我相信您的代碼應該可以作業。
uj5u.com熱心網友回復:
下面介紹的是實作預期目標的一種可能方式。
代碼片段
// 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 }
解釋
添加到上述代碼段的行內注釋。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/473809.html
標籤:javascript 数组 循环 目的
