искать объект в массиве объекта return undefined - PullRequest
0 голосов
/ 21 января 2019

Hy, У меня есть следующий массив объектов, я хочу, чтобы идентификатор возвращал мне свой объект. Как я мог это сделать?

    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
    }]

}

];

например, после возврата идентификатора 2 { ID: 2, нома: «клецки», Prezzo: 12, QTA: 0 }

Ответы [ 4 ]

0 голосов
/ 21 января 2019

Одним из подходов может быть использование метода 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)
0 голосов
/ 21 января 2019

Вы можете использовать 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 не поддерживается в вашем браузере , используйте concat и Синтаксис распространения

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)
0 голосов
/ 21 января 2019
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.

0 голосов
/ 21 января 2019

Вы можете использовать методы .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));
...