javascript将数组与对象数组进行比较

javascript将数组与对象数组进行比较,javascript,angularjs,arrays,loops,Javascript,Angularjs,Arrays,Loops,我有一些我正在研究的角度代码。我们的目标是尽可能少地使用angular 1.x功能,因为它很快就会被重构 我正在比较一个数组 let subscription = [ "Cinemax Subscription", "Disney Subscription", "Encore Subscription", "Epix Subscription", "HBO Subscription", "MLB Subscription", "NBA Subscrip

我有一些我正在研究的角度代码。我们的目标是尽可能少地使用angular 1.x功能,因为它很快就会被重构

我正在比较一个数组

  let subscription = [
  "Cinemax Subscription", 
  "Disney Subscription", 
  "Encore Subscription", 
  "Epix Subscription", 
  "HBO Subscription", 
  "MLB Subscription", 
  "NBA Subscription", 
  "NHL Subscription", 
  "Division"
]
指向包含另一个数组的具有键值关系的对象数组

let profiles = [
    {
        name:"1+ Adults in Household",
        qualifiers: [
            {
                name: 'Number of adults in the household'
            }
        ]
    },
    {
        name: '75k',
        qualifers: [
            {
                name: 'Division'
            },
            {
                name: 'Income'
            }
        ]
    },
    {
        name: 'Time Warner',
        qualifers: [
            {
                name: 'Division'
            }
        ]
    }
]
我在索引和循环方面遇到了困难

let = profilesFiltered = [];
最初我尝试使用过滤器和angular.for 每个用于比较阵列

let filteredProfiles = subscription.filter( function (src) {
    angular.forEach(profiles, function (key, index) {
        if(src === key.qualifiers[index].name) {
            profilesFiltered.push(key);
        }
    })
});
我在if声明中看到

key.qualifiers[index].name // 'Number of adults in the household'
与之相比,一开始是正确的

subscription[0]   // however, it will continue to 1 on the first object which isn't there.  
我看到它是如何开始失败的。但我不知道如何正确循环**profiles**数组中的限定符

期望的结果是那些houseDivision,这是索引中的最后一个数组项

profilesFiltered = [
    {
    name: '75k',
    qualifers: [
      {
        name: 'Division'
      },
      {
        name: 'Income'
      }
    ]
  },
  {
      name: 'Time Warner',
      qualifers: [
          {
              name: 'Division'
          }
      ]
  }
]
在这一点上,我们非常感谢您的任何反馈


谢谢

只需结合使用
filter()
some()
过滤配置文件即可:

let订阅=[
“Cinemax订阅”,
“迪士尼订阅”,
“安可订阅”,
“Epix订阅”,
“HBO订阅”,
“MLB订阅”,
“NBA订阅”,
“NHL订阅”,
“分部”
]
让配置文件=[{
名称:“1+家庭成人”,
限定符:[{
姓名:“家庭中成年人的数量”
}]
},
{
名称:'75k',
限定符:[{
名称:‘部门’
},
{
姓名:“收入”
}
]
},
{
名称:“时代华纳”,
限定符:[{
名称:‘部门’
}]
}
]
让res=profiles.filter(v=>v.qualifiers.some(q=>subscription.includes(q.name));

console.log(res)
只需使用
filter()
some()
的组合来过滤配置文件:

let订阅=[
“Cinemax订阅”,
“迪士尼订阅”,
“安可订阅”,
“Epix订阅”,
“HBO订阅”,
“MLB订阅”,
“NBA订阅”,
“NHL订阅”,
“分部”
]
让配置文件=[{
名称:“1+家庭成人”,
限定符:[{
姓名:“家庭中成年人的数量”
}]
},
{
名称:'75k',
限定符:[{
名称:‘部门’
},
{
姓名:“收入”
}
]
},
{
名称:“时代华纳”,
限定符:[{
名称:‘部门’
}]
}
]
让res=profiles.filter(v=>v.qualifiers.some(q=>subscription.includes(q.name));

console.log(res)
是否要查找类似的内容,请签出我的代码

let profiles=[
{
名称:“1+家庭成人”,
限定符:[
{
姓名:“家庭中成年人的数量”
}
]
},
{
名称:'75k',
限定符:[
{
名称:‘部门’
},
{
姓名:“收入”
}
]
},
{
名称:“时代华纳”,
限定符:[
{
名称:‘部门’
}
]
}
];
让订阅=[
“Cinemax订阅”,
“迪士尼订阅”,
“安可订阅”,
“Epix订阅”,
“HBO订阅”,
“MLB订阅”,
“NBA订阅”,
“NHL订阅”,
“分部”
];
让profilesFiltered=profiles.filter(函数(a){
//首先过滤profiles数组中的所有元素
//检查其限定符数组是否为空
返回a.qualifiers.some(函数(b){
//通过检查属性名称筛选限定符数组
//它是否从订阅数组中删除了任何元素
返回订阅。indexOf(b.name)!=-1;
});
});

console.log(profilesFiltered)您是否正在寻找类似的内容,请签出我的代码

let profiles=[
{
名称:“1+家庭成人”,
限定符:[
{
姓名:“家庭中成年人的数量”
}
]
},
{
名称:'75k',
限定符:[
{
名称:‘部门’
},
{
姓名:“收入”
}
]
},
{
名称:“时代华纳”,
限定符:[
{
名称:‘部门’
}
]
}
];
让订阅=[
“Cinemax订阅”,
“迪士尼订阅”,
“安可订阅”,
“Epix订阅”,
“HBO订阅”,
“MLB订阅”,
“NBA订阅”,
“NHL订阅”,
“分部”
];
让profilesFiltered=profiles.filter(函数(a){
//首先过滤profiles数组中的所有元素
//检查其限定符数组是否为空
返回a.qualifiers.some(函数(b){
//通过检查属性名称筛选限定符数组
//它是否从订阅数组中删除了任何元素
返回订阅。indexOf(b.name)!=-1;
});
});

console.log(profilesFiltered)以下是数据结构的工作代码。它是基于使用函数的。如果您需要没有副本-


下面是一个适用于您的数据结构的工作代码。它是基于使用函数的。如果您需要没有副本-


你的问题,至少对我来说,仍然很不清楚。你的代码有很多错误。例如,在筛选函数中不返回布尔值。所以你的FilteredProfile总是空的。您没有运行
限定符
数组-在第一个btw之后的对象中拼写错误-您只查找第一个限定符。等等。你可以提供一个小例子,自我解释你想要达到的目标。你的问题,至少对我来说,仍然很不清楚。你的代码有很多错误。例如,在筛选函数中不返回布尔值。所以你的FilteredProfile总是空的。您没有运行
限定符
数组-在第一个btw之后的对象中拼写错误-您只是在查找fir
profiles.filter(v => v.qualifiers.some(q => subscription.includes(q.name)));
let profiles = [
{
    name:"1+ Adults in Household",
    qualifiers: [
        {
            name: 'Number of adults in the household'
        }
    ]
},
{
    name: '75k',
    qualifiers: [
        {
            name: 'Division'
        },
        {
            name: 'Income'
        }
    ]
},
{
    name: 'Time Warner',
    qualifiers: [
        {
            name: 'Division'
        }
    ]
}
];



let subscription = [
  "Cinemax Subscription", 
  "Disney Subscription", 
  "Encore Subscription", 
  "Epix Subscription", 
  "HBO Subscription", 
  "MLB Subscription", 
  "NBA Subscription", 
  "NHL Subscription", 
  "Division"
];


var filteredProfiles = profiles.reduce(function (collectedResults, profile) {

    var newResults = profile.qualifiers.reduce(function(foundQualifiers, qualifier) {

        if(subscription.indexOf(qualifier.name) > -1) {
            return foundQualifiers.concat(qualifier.name);
        } else {
            return foundQualifiers;
        }

    }, []);

    return collectedResults.concat(newResults);

}, []);

document.write(filteredProfiles);