簡體   English   中英

在對象數組中查找對象返回未定義

[英]look for an object in an array of object return undefined

嗨,我有以下對象數組,希望id返回給我它的對象。 我該怎么辦?

    prodotto=[
{
    categoria:"primi",
    prodotti:[
    {
        id:1,
        nome:"pasta",
        prezzo:12,
        qta:0
    },{
        id:2,
        nome:"gnocchi",
        prezzo:12,
        qta:0
    }
    ]
},
{
    categoria:"secondi",
    prodotti:[  {
        id:3,
        nome:"salsiccia",
        prezzo:12,
        qta:0
    },{
        id:4,
        nome:"frittura",
        prezzo:12,
        qta:0
    }]

}

];

例如,在id 2返回{id:2,nome:“ gnocchi”,prezzo:12,qta:0}之后

您可以使用.map().find()方法找到所需的對象。

 let data = [{ categoria:"primi", prodotti:[ { id:1, nome:"pasta", prezzo:12, qta:0 }, {id:2, nome:"gnocchi", prezzo:12, qta:0 } ]}, { categoria:"secondi", prodotti:[ { id:3, nome:"salsiccia", prezzo:12, qta:0 }, {id:4, nome:"frittura", prezzo:12, qta:0 } ]}]; let locator = (objId) => [].concat(...data.map(({ prodotti }) => prodotti)) .find(( {id} ) => id === objId); console.log(locator(2)); 

您也可以將中間結果存儲在另一個數組中,以輕松地對其進行迭代並找到結果對象。

 let data = [{ categoria:"primi", prodotti:[ { id:1, nome:"pasta", prezzo:12, qta:0 }, {id:2, nome:"gnocchi", prezzo:12, qta:0 } ]}, { categoria:"secondi", prodotti:[ { id:3, nome:"salsiccia", prezzo:12, qta:0 }, {id:4, nome:"frittura", prezzo:12, qta:0 } ]}]; let _data = [].concat(...data.map(({ prodotti }) => prodotti)); let locator = (objId) => _data.find(( {id} ) => id === objId); console.log(locator(2)); 

您可以使用flatMap進行find如下所示:

 const prodotto = [{categoria:"primi",prodotti:[{id:1,nome:"pasta",prezzo:12,qta:0},{id:2,nome:"gnocchi",prezzo:12,qta:0}]},{categoria:"secondi",prodotti:[{id:3,nome:"salsiccia",prezzo:12,qta:0},{id:4,nome:"frittura",prezzo:12,qta:0}]}] const output = prodotto.flatMap(a => a.prodotti).find(p => p.id === 2) console.log(output) 

如果瀏覽器支持 flatMap ,請使用concatSpread語法

 const prodotto = [{categoria:"primi",prodotti:[{id:1,nome:"pasta",prezzo:12,qta:0},{id:2,nome:"gnocchi",prezzo:12,qta:0}]},{categoria:"secondi",prodotti:[{id:3,nome:"salsiccia",prezzo:12,qta:0},{id:4,nome:"frittura",prezzo:12,qta:0}]}] const output = [].concat(...prodotto.map(a => a.prodotti)) .find(p => p.id === 2) console.log(output) 

function getObjById(id) {
  for (var i = 0; i < prodotto.length; i++) {
    var obj = prodotto[i];
    for (var j = 0; j < obj.prodotti.length; j++) {
      var inn = obj.prodotti[j];
      if (inn.id === id) return inn;
    }
  }
}

console.log(getObjById(4));

這是javascript的舊版本,ECMA5支持它。

一種方法是將Array#reduce方法與Array#find結合使用。 這樣,您就可以遍歷每個prodotto數組項,並將該數組“縮小”到所需的結果(即prodotti子數組中id匹配2 )。

在每個reduce迭代期間,以下邏輯允許您“傳遞”先前找到的結果,或調用對子數組項的搜索(通過Array#find方法):

// If currentResult defined, return that, otherwise look for a matching item
// in prodotti sub-array which will become the currentResult for subsequent
// iterations:
return currentResult || item.prodotti.find(subitem => {
  return subitem.id === 2;
});

這兩個想法組合成一個可行的解決方案,如下所示:

 var prodotto = [{ categoria: "primi", prodotti: [{ id: 1, nome: "pasta", prezzo: 12, qta: 0 }, { id: 2, nome: "gnocchi", prezzo: 12, qta: 0 }] }, { categoria: "secondi", prodotti: [{ id: 3, nome: "salsiccia", prezzo: 12, qta: 0 }, { id: 4, nome: "frittura", prezzo: 12, qta: 0 }] } ]; // Use reduce to search all sub arrays of the prodotto array var result = prodotto.reduce((currentResult, item) => { // return the current result found, or if none yet return // the result (if any) that is found in the prodotti sub array return currentResult || item.prodotti.find(subitem => { return subitem.id === 2; }); }, undefined) console.log(result) 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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