javascript 如何循环并获得第一个满足条件 object 与各自的索引和 parent 索引
javascript how to loop and get the first satisfied condition object with the respective index and parent index
这是我的数据集 object 集,我想迭代并需要以下注释项的结果:
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}')
满足 object 项。
即:结果应该是
{
name: 'comp2' ,
Id: 7645,
qccheck: { hit: true},
}
ii) 索引同时满足object和parent object
即:结果应该是 'data index = 0'
和 child `'company index=1'
所以基本上在循环迭代之后我想知道满足的第一个条件 object 和那个 object 的索引以及 parent object 索引
谁能提出实现该目标的最佳方法?
一个简单的双 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;
}
也许这就是你想要的。
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; }
你可以像这样使用 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)
这是我的数据集 object 集,我想迭代并需要以下注释项的结果:
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}')
满足 object 项。
即:结果应该是
{
name: 'comp2' ,
Id: 7645,
qccheck: { hit: true},
}
ii) 索引同时满足object和parent object
即:结果应该是 'data index = 0'
和 child `'company index=1'
所以基本上在循环迭代之后我想知道满足的第一个条件 object 和那个 object 的索引以及 parent object 索引
谁能提出实现该目标的最佳方法?
一个简单的双 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;
}
也许这就是你想要的。
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; }
你可以像这样使用 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)