我有一个这样的数组:
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
答案 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;
或者Array#filter
使用Array#map
方法(不是一种有效的方式,因为它需要迭代两次)。
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;
答案 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.reduce
与shorthand if
一起使用一行代码:
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;
答案 4 :(得分:0)
有一种纯粹的功能性方法,但它不是特别有效,因为它需要通过数组进行三次单独的线性扫描:
let indexes = array.map((e, i) => [i, e])
.filter(([i, e]) => predicate(e))
.map(([i, _]) => i);
,其中
let predicate = e => e.prop1 === 'abc';
这可以通过创建一个临时数组来实现,其中每个元素本身和包含原始索引和元素的数组。然后它过滤掉谓词函数不为真的那些,然后剥离数组,使它们只包含索引。