JavaScript, как зациклить и получить первый удовлетворенный объект условия с соответствующим индексом и родительским индексом - PullRequest
0 голосов
/ 20 февраля 2019

Вот мой набор объектов набора данных, я хочу выполнить итерацию, и мне нужен результат нижеуказанного элемента:

var data = [
    { 
        name: 'sam', 
        id: 12235,
        qccheck: { hit: false},
        company: [
                   {
                      name: 'comp1' , 
                      Id: 5356,
                      qccheck: { hit: false},
                   },
                   {
                      name: 'comp2' , 
                      Id: 7645,
                      qccheck: { hit: true},
                   }
                ]
   },
   { 
        name: 'mark', 
        id: 8877,
        qccheck: { hit: true},
        company: [
                   {
                      name: 'comp3', 
                      Id: 3865,
                      qccheck: { hit: true},
                   },
                   {
                      name: 'comp4', 
                      Id: 87546,
                      qccheck: { hit: false},
                   }
                ]
   }
]

i) первое условие ('qccheck: { hit: true}') удовлетворенный элемент объекта.т.е.: результат должен быть

  {
      name: 'comp2' , 
      Id: 7645,
      qccheck: { hit: true},
   }

ii) и индекс как удовлетворяющего условию объекта, так и родительского объекта, т.е. результат должен быть 'data index = 0' и дочерний `'индекс компании = 1'

так что в основном после итерации цикла я хочу знать первое удовлетворенное условию объект и индекс этого объекта, а также индекс родительского объекта

Кто-нибудь может предложить лучший способ достичь этого?

Ответы [ 3 ]

0 голосов
/ 20 февраля 2019

Может быть, это то, что вы хотите.

ES5

var data = [{ name: 'sam', id: 12235, qccheck: { hit: false }, company: [{ name: 'comp1', Id: 5356, qccheck: { hit: false } }, { name: 'comp2', Id: 7645, qccheck: { hit: true } }] }, { name: 'mark', id: 8877, qccheck: { hit: true }, company: [{ name: 'comp3', Id: 3865, qccheck: { hit: true } }, { name: 'comp4', Id: 87546, qccheck: { hit: false } }] }],
    result;

data.some(function (object, i) {
    if (object.qccheck.hit) {
        return result = { object: object, dataIndex: i };
    }
    return object.company.some(function (company, j) {
        if (company.qccheck.hit) {
            return result = { company: company, dataIndex: i, companyIndex: j };
        }
    });
});

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

ES6

var data = [{ name: 'sam', id: 12235, qccheck: { hit: false }, company: [{ name: 'comp1', Id: 5356, qccheck: { hit: false } }, { name: 'comp2', Id: 7645, qccheck: { hit: true } }] }, { name: 'mark', id: 8877, qccheck: { hit: true }, company: [{ name: 'comp3', Id: 3865, qccheck: { hit: true } }, { name: 'comp4', Id: 87546, qccheck: { hit: false } }] }],
    result;

data.some((object, dataIndex) =>
    object.qccheck.hit && (result = { object, dataIndex }) ||
    object.company.some((company, companyIndex) => 
        company.qccheck.hit && (result = { company, dataIndex, companyIndex }))
);

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 20 февраля 2019

Вы можете использовать some вот так (ES5):

var data = [{ name: 'sam', id: 12235, qccheck: { hit: false }, company: [{ name: 'comp1', Id: 5356, qccheck: { hit: false } }, { name: 'comp2', Id: 7645, qccheck: { hit: true } }] }, { name: 'mark', id: 8877, qccheck: { hit: true }, company: [{ name: 'comp3', Id: 3865, qccheck: { hit: true } }, { name: 'comp4', Id: 87546, qccheck: { hit: false } }] }];

let company, dataIndex, companyIndex;

data.some(function(a, i) {
  dataIndex = i;
  return a.company.some(function(b, j) {
    companyIndex = j;
    company = b;
    return b.qccheck.hit
  })
})

console.log(company)
console.log(dataIndex, companyIndex)

some остановит цикл, как только будет найден соответствующий company.

Вот однострочный ES6:

let data = [{ name: 'sam', id: 12235, qccheck: { hit: false }, company: [{ name: 'comp1', Id: 5356, qccheck: { hit: false } }, { name: 'comp2', Id: 7645, qccheck: { hit: true } }] }, { name: 'mark', id: 8877, qccheck: { hit: true }, company: [{ name: 'comp3', Id: 3865, qccheck: { hit: true } }, { name: 'comp4', Id: 87546, qccheck: { hit: false } }] }];

let output;

data.some((a, i) => a.company.some((b, j) => 
    output = b.qccheck.hit && { company: b, dataIndex: i, companyIndex: j }))

console.log(output)
0 голосов
/ 20 февраля 2019

Простая двойная for петля должна сделать трюк

var obj = null;
var data_index = -1;
var company_index = -1;

for (var i = 0; i < data.length; ++i)
{
  if (data[i].qccheck.hit)
  {
    obj = data[i];
    data_index = i;
    break;
  }

  if (!data[i].company) continue;
  for (var j = 0; j < data[i].company.length; ++j)
  {
    if (data[i].company[j].qccheck.hit)
    {
      obj = data[i].company[j];
      data_index = i;
      company_index = j;
      break;
    }
  }

  if (obj) break;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...