在对象数组中查找对象返回未定义

时间:2019-01-21 08:43:32

标签: javascript arrays object search find

嗨, 我有以下对象数组,希望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,             主题:“尼奥基”,             prezzo:12,             qta:0         }

4 个答案:

答案 0 :(得分: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));

答案 1 :(得分:0)

您可以像这样使用flatMapfind

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不是supported in your browser,请使用concatSpread syntax

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)

答案 2 :(得分:0)

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支持。

答案 3 :(得分:0)

一种方法可能是结合使用Array#reduce方法和Array#find。这样,您就可以遍历每个prodotto数组项,并将该数组“缩小”到所需的结果(即prodotti子数组中的项,其中包含id匹配2)。

在每个reduce迭代期间,以下逻辑使您可以“通过”先前找到的结果,或调用对子数组项的搜索(通过Array#find方法):< / p>

// 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)