如何在 JSON 資料集中的特定子項的父鍵中查找值?我的 JSON 資料如下所示:
DATA = {
"result":"Ok",
"data":[{
"orderNumber":"Order1",
"anyKey":"something else",
"samples":[{
"sampleNumber":"sample1",
"anyOtherKey":"something",
"item123":"abc 123"
},{
"sampleNumber":"sample2",
"anyOtherKey":"something",
"item123":"def 123"
}],
"tests":[{
"testNumber":"DP2200200-01",
"testTypeName":"testtype1"
}]
},{
"orderNumber":"Order2",
"anyKey":"something",
"samples":[{
"sampleNumber":"sample2",
"anyKey":"something",
}],
"tests":[{
"testNumber":"test2",
"testTypeName":"testtype2"
}]
},{
"orderNumber":"Order3",
"anyKey":"something",
"samples":[{
"sampleNumber":"sample1",
"anyOtherKey":"something",
"item123":"xyz 123"
}]
}
]}
我需要一種在內部搜索字串(如abc)item123并回傳屬于它的OrderNumber的方法。到目前為止,我確實通過
let keyword = "abc"
let mydata = DATA.data.find(order => order.samples.find(sam => sam.item123.includes(keyword)));
if ( typeof mydata == 'undefined') {
document.getElementById("orderNumber").innerHTML = "nothing found :-(";
} else {
var myOutput = mydata ["orderNumber"];
document.getElementById("orderNumber").innerHTML = myOutput ;
}
只要孩子有item123,它就可以正常作業,因此它適用于Order1但對 Order3 失敗,因為Order2沒有item123. 但是有些集合沒有這個屬性。
另一個缺點是它只找到第一次出現。如何找到所有事件并回傳相關的sampleNumber?
uj5u.com熱心網友回復:
首先你需要過濾掉物件
const filteredData = DATA.data.filter(d => d.samples.find(s => s?.item123?.includes('abc')));
然后,您可以提取所需的值。在這里,我正在提取 orderNumber。
const orderNumbers = filteredData.map(fd => fd.orderNumber);
您甚至可以使用 flatMap 代替 filter 和 map 在同一回圈中進行過濾和提取。
uj5u.com熱心網友回復:
如何找到所有事件并回傳相關的 sampleNumber?
我假設這意味著您想要一個包含(比如說)具有這兩個屬性的物件的陣列。
您只需要嵌套回圈和可選鏈接:
const results = [];
for (const element of DATA.data) {
for (const {item123, sampleNumber} of element.samples) {
if (item123?.includes(keyword)) {
// ^?????????????????????????????????? optional chaining
results.push({item123, sampleNumber});
}
}
}
如果你還不能在你的環境中使用可選鏈,你可以做一個真實性測驗:
if (item123 && item123.includes(keyword)) {
現場示例:
顯示代碼片段
const DATA = {
"result":"Ok",
"data":[{
"orderNumber":"Order1",
"anyKey":"something else",
"samples":[{
"sampleNumber":"sample1",
"anyOtherKey":"something",
"item123":"abc 123"
},{
"sampleNumber":"sample2",
"anyOtherKey":"something",
"item123":"def 123"
}],
"tests":[{
"testNumber":"DP2200200-01",
"testTypeName":"testtype1"
}]
},{
"orderNumber":"Order2",
"anyKey":"something",
"samples":[{
"sampleNumber":"sample2",
"anyKey":"something",
}],
"tests":[{
"testNumber":"test2",
"testTypeName":"testtype2"
}]
},{
"orderNumber":"Order3",
"anyKey":"something",
"samples":[{
"sampleNumber":"sample1",
"anyOtherKey":"something",
"item123":"abc 123"
}]
}
]};
const keyword = "abc";
const results = [];
for (const element of DATA.data) {
for (const {item123, sampleNumber} of element.samples) {
if (item123?.includes(keyword)) {
results.push({item123, sampleNumber});
}
}
}
console.log(results);
.as-console-wrapper {
max-height: 100% !important;
}
(請注意,我將關鍵字添加到其中的第二個元素中,這樣您就可以看到所有這些元素都被找到了。)
你也可以用mapand來做flat(雖然不是,很遺憾,flatMap因為我們需要大于 1 的深度):
const results = DATA.data.map(element =>
element.samples.map(({item123, sampleNumber}) =>
item123?.includes(keyword) ? {item123, sampleNumber} : []
)
).flat(Infinity);
......但我不會。更難閱讀,更難除錯,并且涉及創建不必要的臨時陣列。不過,有些人喜歡這種東西,所以...
現場示例:
顯示代碼片段
const DATA = {
"result":"Ok",
"data":[{
"orderNumber":"Order1",
"anyKey":"something else",
"samples":[{
"sampleNumber":"sample1",
"anyOtherKey":"something",
"item123":"abc 123"
},{
"sampleNumber":"sample2",
"anyOtherKey":"something",
"item123":"def 123"
}],
"tests":[{
"testNumber":"DP2200200-01",
"testTypeName":"testtype1"
}]
},{
"orderNumber":"Order2",
"anyKey":"something",
"samples":[{
"sampleNumber":"sample2",
"anyKey":"something",
}],
"tests":[{
"testNumber":"test2",
"testTypeName":"testtype2"
}]
},{
"orderNumber":"Order3",
"anyKey":"something",
"samples":[{
"sampleNumber":"sample1",
"anyOtherKey":"something",
"item123":"abc 123"
}]
}
]};
const keyword = "abc";
const results = DATA.data.map(element =>
element.samples.map(({item123, sampleNumber}) =>
item123?.includes(keyword) ? {item123, sampleNumber} : []
)
).flat(Infinity);
console.log(results);
.as-console-wrapper {
max-height: 100% !important;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/448558.html
標籤:javascript json
上一篇:未捕獲的語法錯誤:控制臺中App.js:18:1處JSON.parse(<anonymous>)位置0處JSON中的意外標記u
