Найти индекс в массиве JavaScript между совпадениями - PullRequest
0 голосов
/ 29 мая 2018

У меня есть массив, скажем:

const section = [{type: TYPE_B}, {type: TYPE_A}, {type: TYPE_B}, {type: TYPE_A}, {type: TYPE_A}];

Я хочу получить индекс первого элемента с TYPE_A, где следующий элемент также TYPE_A

Это то, что я пытался:

const firstMatch = section.reduce((a, b) => {
   if (a.type === TYPE_A && b.type === TYPE_A) {
     return a;
   }
});

Это не работает, так как возвращает неопределенное значение для всех несоответствий, и код падает на следующей итерации.

Ответы [ 6 ]

0 голосов
/ 29 мая 2018

Это вернет список элементов, которые равны следующему элементу в массиве.

var TYPE_A = {"a":"a"};
var TYPE_B = {"b":"b"};
const section = [{type: TYPE_B}, {type: TYPE_A}, {type: TYPE_B}, {type: TYPE_A}, {type: TYPE_A}];

var results = [];
if (section.length > 1) {
    for(var i = 0; i < section.length -1;i++){
    if(section[i].type == section[i+1].type){
      results.push(i);
    }
  }
}
console.log(results);
0 голосов
/ 29 мая 2018

Если вы действительно хотите найти первый индекс из двух последовательных TYPE_A элементов, тогда вы можете использовать findIndex следующим образом:

section.findIndex((e, idx, arr) => e.type === TYPE_A && arr[idx+1] && arr[idx+1].type === TYPE_A)
0 голосов
/ 29 мая 2018

const section = [
  {type: "TYPE_B"},
  {type: "TYPE_A"},
  {type: "TYPE_B"},
  {type: "TYPE_A"},
  {type: "TYPE_A"}
];

for (var i = 0; i < section.length - 1; i++) {
  if (section[i].type == "TYPE_A" && section[i + 1].type == "TYPE_A") {
    console.log(i);
  }
}

Примечание. Я добавляю кавычки в каждом случае TYPE_A и TYPE_B.Если это переменные, пожалуйста, удалите кавычки.Я сохранил их здесь, потому что они будут возвращать ошибку, если интерпретатор рассматривает их как переменные (они не определены).

0 голосов
/ 29 мая 2018

    const section = [{
      type: 'TYPE_B'
    }, {
      type: 'TYPE_A'
    }, {
      type: 'TYPE_B'
    }, {
      type: 'TYPE_A'
    }, {
      type: 'TYPE_A'
    }];

    var first=-1,second=-1;
    
    section.forEach((typeObj,index)=>{
       if(first===-1){
         if(typeObj.type==='TYPE_A') first=index;
       }
       else if(first>=0){
         if(typeObj.type==='TYPE_A') second=index;
       }
    })
    
    if(first>=0 && second>0) console.log(first+1);
    else console.log("not found")
0 голосов
/ 29 мая 2018

Вы можете использовать Array#findIndex и проверить предшествующий элемент и фактический элемент для требуемого type.

var section = [{ type: 'TYPE_B' }, { type: 'TYPE_A' }, { type: 'TYPE_B' }, { type: 'TYPE_A' }, { type: 'TYPE_A' }],
    type = 'TYPE_A',
    index = section.findIndex((o, i, a) => i && a[i - 1].type === type && o.type === type);

console.log(index);
0 голосов
/ 29 мая 2018

Вы можете использовать findIndex

const section = [{type: 'TYPE_B'}, {type: 'TYPE_A'}, {type: 'TYPE_B'}, {type: 'TYPE_A'}, {type: 'TYPE_A'}];
const toFind = 'TYPE_A';

let idx = section.findIndex((o, i, a) => a[i - 1] && a[i - 1].type === toFind && a[i + 1] && a[i + 1].type === toFind && o.type !== toFind);

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