Javascript 在数组对象中筛选数组后返回值
我试图创建一个自动完成,它使用函数返回一个对象数组。我的目标是:Javascript 在数组对象中筛选数组后返回值,javascript,angular,ecmascript-6,functional-programming,Javascript,Angular,Ecmascript 6,Functional Programming,我试图创建一个自动完成,它使用函数返回一个对象数组。我的目标是: this.vehiclesList = [ { "additionalDriverContacts": [9929929929, 9992992933, 9873773777], "id": 1 }, { "additionalDriverContacts": [8388388388, 8939939999], "id": 2 } ] 我想根
this.vehiclesList =
[
{
"additionalDriverContacts": [9929929929, 9992992933, 9873773777],
"id": 1
},
{
"additionalDriverContacts": [8388388388, 8939939999],
"id": 2
}
]
我想根据additionalDriverContacts过滤数组
我的功能如下:
filterVehicleAdditionalMobile(val: string) {
if (typeof val != 'string') {
return [];
}
let value= val? this.vehiclesList.filter((item) => {
if(item.additionalDriverContacts)
item.additionalDriverContacts.forEach((option)=> {
String(option).toLowerCase().indexOf(val.toLowerCase()) != -1
})
}
}) : this.vehiclesList;
console.log(value)
return value;
}
但在控制台中,值是空数组。我哪里出错了。我试着寻找这个问题的答案
但是它没有帮助,因为我的用例是不同的
我想要的结果应该是:
如果将99299作为参数传递给函数,则与该数字匹配的additionalDriverContacts应作为数组返回。
对于输入99299,应返回结果=[99299929933]更新:问题的最后一次编辑 尝试通过以下方式进行更改:
filterVehicleAdditionalMobile(val: string) {
if (typeof val !== 'string') {
return [];
}
let driverContacts = [];
this.vehiclesList.forEach((vehicule) => {
if (vehicule.additionalDriverContacts) {
if (val) {
driverContacts = driverContacts.concat(vehicule.additionalDriverContacts.filter((driverContact) => {
return String(driverContact).toLowerCase().indexOf(val.toLowerCase()) !== -1;
}));
} else {
driverContacts = driverContacts.concat(vehicule.additionalDriverContacts);
}
}
});
return driverContacts;
}
测试:
const driver = this.filterVehicleAdditionalMobile('8');
console.log(driver);
显示:
0:9873773777
1: 8388388388
2:8939939999因此,您需要在这里首先将
车辆列表
中的每个项目转换为一个匹配结果数组,然后将它们连接在一起
尝试一下:
var车辆列表=[{
“其他驱动器触点”:[99299299299299339873773777],
“id”:1
},
{
“其他驱动器触点”:[83883883888939939999],
“id”:2
}
];
功能过滤器车辆附加移动(val){
if(typeof val!=“string”){
返回[];
}
//数组的数组
常量值=车辆列表.map((项目)=>{
如果(!item.additionalDriverContacts){return[];}
返回项.additionalDriverContacts.filter((选项)=>
字符串(选项).toLowerCase().indexOf(val.toLowerCase())!=-1
);
});
console.log(值);
//压扁
返回Array.prototype.concat.apply([],值);
}
console.log(filterVehicleAdditionalMobile('99')代码>
对于输入99299
,应返回结果=[99299929933]
我们可以使用数组.map()
提取联系人,然后使用字符串.search()
进行筛选:
const vehiclesList=[
{“id”:1,“additionalDriverContacts”:[9929929929939873773777],
{“id”:2,“additionalDriverContacts”:[83883883888939939999]}]
结果=getMatchingContacts(车辆列表,99299)//运行测试
console.log(result)//显示结果
函数getMatchingContacts(列表,键){
const arrayOfContacts=list.map(item=>item.additionalDriverContacts)
const contacts=[].concat(…arrayOfContacts)//展平嵌套数组
.filter(contact=>contact.toString().search(key.toString())>=0)//查找匹配项
返回联系人
}
注意:您最初使用的是此.vehicleList
,但您的代码后来使用的是:此.vehicleList
-extras
。另外,您的字符串(选项)
行是一个孤立的表达式。代码中没有JSON。它是一个JavaScript对象。我会一直指出这一点,直到我死的那天。谢谢你指出了这个错误。我更新了it@ChrisG编辑。Thanxy您的筛选器不返回任何内容,因此所有内容都被concidered为false,然后您将一无所获:)您的解决方案将返回所有数组项的列表,而不是特定的匹配数组项。还有一些语法错误。我保留了代码的逻辑,因为您在过滤器中不使用“val”,这将导致类似的情况。您希望将车辆保留在val与其中一个additionnalDriverContacts匹配的位置?所有匹配的值都应位于array@UdG你看过我的答案了吗?没有,它不起作用。在进行控制台操作时,如果matches@UdG上述两种方法都会生成一个数组,如单击“运行代码段”按钮时所示。在第一个示例中,在将值连接在一起之前,我将记录值
变量,因此请记住向下滚动查看最终值。或者,您是说当您将其适应于自己的代码时,它不会产生期望的结果?