获取满足条件的javascript数组元素的索引

时间:2018-02-02 14:00:16

标签: javascript

我有一个这样的数组:

struct Circle
{
    Circle() : innerCircle(nullptr) {}
    Circle* innerCircle;

    void insert(Circle *inner)
    {
        innerCircle = inner;
    }

    bool hasInner() const { return (innerCircle != nullptr); }
    Circle* getInner() const) { return innerCircle; }
};

我想获得满足条件的所有元素的索引;在这种情况下,[{prop1:"abc",prop2:"qwe"},{prop1:"abc",prop2:"yutu"},{prop1:"xyz",prop2:"qwrq"}] 时。所以期望的输出类似于prop1 == "abc"

苦苦寻找一种干净的方法吗? [0,1]将为上述数组返回indexes = a.findIndex(x => x.prop1==="abc"),因为它会在第一次成功查找时停止。

我觉得我想要这样的东西:0

5 个答案:

答案 0 :(得分:2)

您可以使用Array#reduce方法。



var data = [{prop1:"abc",prop2:"qwe"},{prop1:"abc",prop2:"yutu"},{prop1:"xyz",prop2:"qwrq"}];

console.log(
  data.reduce(function(arr, e, i) {
    if (e.prop1 == 'abc') arr.push(i);
    return arr;
  }, [])
)

// with ES6 arrow syntax
console.log(
  data.reduce((arr, e, i) => ((e.prop1 == 'abc') && arr.push(i), arr), [])
)




使用简单的for循环



var data = [{prop1:"abc",prop2:"qwe"},{prop1:"abc",prop2:"yutu"},{prop1:"xyz",prop2:"qwrq"}];

var res = [];

for (var i = 0; i < data.length; i++) {
  if (data[i].prop1 == 'abc') res.push(i);
}

console.log(res)
&#13;
&#13;
&#13;

或者Array#filter使用Array#map方法(不是一种有效的方式,因为它需要迭代两次)。

&#13;
&#13;
var data = [{prop1:"abc",prop2:"qwe"},{prop1:"abc",prop2:"yutu"},{prop1:"xyz",prop2:"qwrq"}];


console.log(
  data.map(function(e, i) {
    return i;
  }).filter(function(e) {
    return data[e].prop1 == 'abc';
  })
)

// With ES6 arrow syntax
console.log(
  data.map((_, i) => i).filter(e => data[e].prop1 == 'abc')
)
&#13;
&#13;
&#13;

答案 1 :(得分:1)

您可以使用reduce功能。

var array = [{ prop1: "abc", prop2: "qwe" }, 
             { prop1: "abc", prop2: "yutu" }, 
             { prop1: "xyz", prop2: "qwrq" }];

var indexes = array.reduce((a, c, i/*Current index*/) => {
  if (c.prop1 == "abc") a.push(i); //Add the found index.
  return a;
}, []/*Accumulator to store the found indexes.*/);

console.log(indexes);

资源

答案 2 :(得分:0)

以下代码适用于我:

var data = [{prop1:"abc",prop2:"qwe"},{prop1:"abc",prop2:"yutu"},{prop1:"xyz",prop2:"qwrq"}]
var indexes = []

data.forEach((element, index)=>{
 if(element.prop1 =="abc"){
   indexes.push(index)
 }
});
    
console.log(indexes)

答案 3 :(得分:0)

您可以array.prototype.reduceshorthand if一起使用一行代码:

&#13;
&#13;
var arr = [ {prop1:"abc",prop2:"qwe"}, {prop1:"abc",prop2:"yutu"},{prop1:"xyz",prop2:"qwrq"} ];

var indexes = arr.reduce((m, e, i) => (e.prop1 === 'abc' && m.push(i), m), []);
console.log(indexes);
&#13;
&#13;
&#13;

答案 4 :(得分:0)

有一种纯粹的功能性方法,但它不是特别有效,因为它需要通过数组进行三次单独的线性扫描:

let indexes = array.map((e, i) => [i, e])
                   .filter(([i, e]) => predicate(e))
                   .map(([i, _]) => i);

,其中

let predicate = e => e.prop1 === 'abc';

这可以通过创建一个临时数组来实现,其中每个元素本身和包含原始索引和元素的数组。然后它过滤掉谓词函数不为真的那些,然后剥离数组,使它们只包含索引。