在匹配的javascript数组中查找索引

时间:2018-05-29 14:50:11

标签: javascript arrays mapreduce

我有一个数组,让我们说:

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;
   }
});

这不起作用,因为它为所有非匹配返回undefined,并且代码在下一次迭代时崩溃。

6 个答案:

答案 0 :(得分:3)

您可以使用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);




答案 1 :(得分:1)

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_ATYPE_B的每个出现时都添加了引号。如果这些是变量,请删除引号。我将它们保留在这里是因为如果解释器将它们视为变量(它们未定义),它们将返回错误。

答案 2 :(得分:1)

如果您真正想要的是找到两个后续TYPE_A元素的第一个索引,那么您可以通过以下方式使用findIndex

section.findIndex((e, idx, arr) => e.type === TYPE_A && arr[idx+1] && arr[idx+1].type === TYPE_A)

答案 3 :(得分:0)

您可以使用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);

答案 4 :(得分:0)

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

答案 5 :(得分:0)

这将返回一个与数组中下一个元素相同的元素列表。

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