簡體   English   中英

遍歷值 JavaScript 對象內的數組

[英]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#includesArray#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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM