Javascript 基于多个条件从复杂数组结构中删除数据
我正在接收以下格式的json数据Javascript 基于多个条件从复杂数组结构中删除数据,javascript,typescript,Javascript,Typescript,我正在接收以下格式的json数据 [ { "key":4, "data":{ "choice":[ { "id":"1.1" }, { "id":"1.2"
[
{
"key":4,
"data":{
"choice":[
{
"id":"1.1"
},
{
"id":"1.2"
}
],
"questionId":"1"
}
},
{
"key":4,
"data":{
"choice":[
{
"id":"1.1.1.1"
},
{
"id":"1.1.1.2"
},
{
"id":"1.1.1.3",
}
],
"questionId":"1.1"
}
},
{
"key":4,
"data":{
"choice":[
{
"id":"1.1.1.3.1.1"
},
{
"id":"1.1.1.3.1.2"
}
],
"questionId":"1.1.1.3"
}
},
{
"key":4,
"data":{
"choice":[
{
"id":"1.1.1.3.1.1.1.1"
},
{
"id":"1.1.1.3.1.1.1.2"
}
],
"questionId":"1.1.1.3.1.1"
}
},
{
"key":5,
"data":{
"choice":[
{
"id":"2.1"
},
{
"id":"2.2"
}
],
"questionId":"2"
}
},
{
"key":5,
"data":{
"choice":[
],
"questionId":"2.2"
},
}
]
我想根据以下多个条件从这个数组中删除记录
this.followUpQues.forEach(function(val,index,object) {
if(val.data.choice.filter(y=>y.id === item.id).length >= 1) {
keyNumber = val.key;
valueIndex = index;
}
})
因此,在获得键和索引后,我尝试在找到索引并具有标识的键值后删除记录,但在foreach中使用splice有奇怪的行为let json=[
{
"关键":四,,
“数据”:{
“选择”:[
{
“id”:“1.1”
},
{
“id”:“1.2”
}
],
“问题ID”:“1”
}
},
{
"关键":四,,
“数据”:{
“选择”:[
{
“id”:“1.1.1.1”
},
{
“id”:“1.1.1.2”
},
{
“id”:“1.1.1.3”,
}
],
“问题ID”:“1.1”
}
},
{
"关键":四,,
“数据”:{
“选择”:[
{
“id”:“1.1.1.3.1.1”
},
{
“id”:“1.1.1.3.1.2”
}
],
“问题ID”:“1.1.1.3”
}
},
{
"关键":四,,
“数据”:{
“选择”:[
{
“id”:“1.1.1.3.1.1.1.1”
},
{
“id”:“1.1.1.3.1.1.1.2”
}
],
“问题ID”:“1.1.1.3.1.1”
}
},
{
“关键”:5,
“数据”:{
“选择”:[
{
“id”:“2.1”
},
{
“id”:“2.2”
}
],
“问题ID”:“2”
}
},
{
“关键”:5,
“数据”:{
“选择”:[
],
“问题ID”:“2.2”
},
}
];
让我们检查=(json,key,id)=>json.map((it,i)=>it.key!==key | i==0?it:json[i-1]。data.choice.map((k,v)=>k.id)。包括(id)?null:it)。过滤器(it=>it!==null);
log(inspect(json,4,'1.1.1.2'));
更新
如果您的意思是删除出现“1.1.1.2”
后的所有内容,则
let inspect=(json,key,id)=>{
let processed=json.map((it,i)=>it.key!==key | | i==0?it:json[i-1]。data.choice.map((k,v)=>k.id)。包含(id)?null:it);
返回已处理。筛选器((it,i)=>
it==null?false:it.key!==key | | i
您可以使用简单的for
循环:
choiceFound = 0
for(let i = 0; i < questions.length; i++ ){
let question = questions[i];
if(question.key == 4){
if(!choiceFound) {
choiceFound = question.data.choice.find(c => c.id == "1.1.1.2") ? 1: 0;
}
else {
questions.splice(i, 1);
i--;
}
}
}
choiceFound=0
for(设i=0;ic.id==“1.1.1.2”)?1:0;
}
否则{
问题.拼接(i,1);
我--;
}
}
}
此问题可分为两个步骤。首先查找与所需谓词匹配的第一个索引,然后在给定键上筛选索引后的结果集。如果您希望效率最高,可以组合这些步骤,但代码可读性将受到影响
const data = [
{
"key":4,
"data":{
"choice":[
{
"id":"1.1"
},
{
"id":"1.2"
}
],
"questionId":"1"
}
},
{
"key":4,
"data":{
"choice":[
{
"id":"1.1.1.1"
},
{
"id":"1.1.1.2"
},
{
"id":"1.1.1.3",
}
],
"questionId":"1.1"
}
},
{
"key":4,
"data":{
"choice":[
{
"id":"1.1.1.3.1.1"
},
{
"id":"1.1.1.3.1.2"
}
],
"questionId":"1.1.1.3"
}
},
{
"key":4,
"data":{
"choice":[
{
"id":"1.1.1.3.1.1.1.1"
},
{
"id":"1.1.1.3.1.1.1.2"
}
],
"questionId":"1.1.1.3.1.1"
}
},
{
"key":5,
"data":{
"choice":[
{
"id":"2.1"
},
{
"id":"2.2"
}
],
"questionId":"2"
}
},
{
"key":5,
"data":{
"choice":[
],
"questionId":"2.2"
},
}
];
const remove = (data, key, id) => {
let result = data;
// find first index that matches our predicate.
// first the key has to match, and then the id must be contained within our choices.
const index = data.findIndex((n) => {
return n.key === key && n.data.choice.findIndex((m) => m.id === id) !== -1;
});
// did we find something? If so start filtering!
if (index !== -1) {
result = data.filter((n, i) => {
// is this element before our filter index? or maybe its not the right key?
// if either are true, keep the element.
return i <= index || n.key !== key;
});
}
return result;
};
console.log(remove(data, 4, "1.1.1.2"));
const数据=[
{
"关键":四,,
“数据”:{
“选择”:[
{
“id”:“1.1”
},
{
“id”:“1.2”
}
],
“问题ID”:“1”
}
},
{
"关键":四,,
“数据”:{
“选择”:[
{
“id”:“1.1.1.1”
},
{
“id”:“1.1.1.2”
},
{
“id”:“1.1.1.3”,
}
],
“问题ID”:“1.1”
}
},
{
"关键":四,,
“数据”:{
“选择”:[
{
“id”:“1.1.1.3.1.1”
},
{
“id”:“1.1.1.3.1.2”
}
],
“问题ID”:“1.1.1.3”
}
},
{
"关键":四,,
“数据”:{
“选择”:[
{
“id”:“1.1.1.3.1.1.1.1”
},
{
“id”:“1.1.1.3.1.1.1.2”
}
],
“问题ID”:“1.1.1.3.1.1”
}
},
{
“关键”:5,
“数据”:{
“选择”:[
{
“id”:“2.1”
},
{
“id”:“2.2”
}
],
“问题ID”:“2”
}
},
{
“关键”:5,
“数据”:{
“选择”:[
],
“问题ID”:“2.2”
},
}
];
常量删除=(数据、键、id)=>{
让结果=数据;
//查找与谓词匹配的第一个索引。
//首先,密钥必须匹配,然后id必须包含在我们的选择中。
常量索引=数据。findIndex((n)=>{
返回n.key==key和n.data.choice.findIndex((m)=>m.id==id)!=-1;
});
//我们找到什么了吗?如果找到了,开始过滤吧!
如果(索引!=-1){
结果=数据。过滤器((n,i)=>{
//这个元素在我们的筛选索引之前吗?或者它不是正确的键?
//如果其中一个为true,则保留该元素。
返回i避免嵌套if条件
choiceFound = 0
for(let i = 0; i < questions.length; i++ ){
let question = questions[i];
if(question.key == 4 && !choiceFound){
choiceFound = question.data.choice.find(c => c.id == "1.1.1.2") ? 1: 0;
}
else {
questions.splice(i, 1);
i--;
}
}
choiceFound=0
for(设i=0;ic.id==“1.1.1.2”)?1:0;
}
否则{
choiceFound = 0
for(let i = 0; i < questions.length; i++ ){
let question = questions[i];
if(question.key == 4 && !choiceFound){
choiceFound = question.data.choice.find(c => c.id == "1.1.1.2") ? 1: 0;
}
else {
questions.splice(i, 1);
i--;
}
}