Javascript 使用layered.reduce()或.filter()函数,基于单独的搜索数组查找对象数组中的对象?
我有一个由构造函数创建的对象数组。与本例相比,这些对象具有更多的键值对。但这一切都很好,所以不相关。让我们尽量保持简洁:) 示例阵列:Javascript 使用layered.reduce()或.filter()函数,基于单独的搜索数组查找对象数组中的对象?,javascript,jquery,Javascript,Jquery,我有一个由构造函数创建的对象数组。与本例相比,这些对象具有更多的键值对。但这一切都很好,所以不相关。让我们尽量保持简洁:) 示例阵列: let contactsArr = [ {id: 1, firstName: "Lucas", email: "lucas@fake.com"}, {id: 2, firstName: "Adrian", email: "adrian@fake.com"}, {id: 3, firstName: "Betrand", email: "zorro@fa
let contactsArr = [
{id: 1, firstName: "Lucas", email: "lucas@fake.com"},
{id: 2, firstName: "Adrian", email: "adrian@fake.com"},
{id: 3, firstName: "Betrand", email: "zorro@fake.com"}
}
];
在html中,我有一个搜索字段#search
。你说对了。此字段用于在联系人对象数组中搜索任何匹配值
此字段的内容将被修剪并复制为字符串数组,除以(1或更多)空格
没问题。在下一步中,我想查找并返回contactsArr
中与$input
中的字符串相等(或包含其一部分)的对象的任何值第一版,我想出了以下代码:
const filteredArr = contactsArr.filter(contact => {
return contact.firstName.toLowerCase().includes($input) ||
contact.email.toLowerCase().includes($input) ||
... // and more key-value pairs to check
});
当$input
返回一个字符串或一个只有一个字符串的数组时,这种方法可以正常工作。如果数组包含更多字符串,则只搜索并返回第一个字符串的结果。但考虑到对象将来可能有更多的键值对,这也有点混乱。因此版本2:
const filteredArr = contactsArr.filter(contact => {
return Object.values(contact).some(x => {
if (typeof x === "number") x = x.toString();
return x.toLowerCase().includes($input);
});
});
版本2返回的结果与版本1完全相同,只是它适用于比代码中列出的键值对多得多的键值对。伟大的但是当$input
数组的值大于1时,第二个值仍然被忽略。经过多次尝试和错误,我希望有人能指出我的错误
这是第3版(甚至可能是第33版):)
预期结果:目标是让所有联系人与$input
中的任何字符串匹配
非常感谢您提供的所有提示和见解 我过去所做的是通过将所有值连接在一起创建一个大的索引字符串。然后可以在
$input
数组上使用Array.prototype.some()
let contactsArr=[
{id:1,名字:“卢卡斯”,电子邮件:lucas@fake.com"},
{id:2,名字:“阿德里安”,电子邮件:adrian@fake.com"},
{id:3,名字:“Betrand”,电子邮件:zorro@fake.com"}
];
让searchVal='lu-rian'
const$input=searchVal.toLowerCase().trim().split(/\s+/);
const filteredar=contactsArr.filter(contact=>{
//通过连接所有值来创建索引字符串
const indexString=Object.values(contact.join(“”).toLowerCase()
//现在,您可以执行单个搜索操作
返回$input.some(word=>indexString.includes(word))
})
console.info(Filteredar)
您能否澄清“匹配(部分)字符串”的含义?例如greathanks@CertainPerformance。我跳过得太快了。更正。@Phil我已更正描述。我希望现在更清楚了?可能是哈的复制品。我理解。这是一个非常有趣的说法,真的让人大开眼界……)谢谢不过,我还是想了解如何使用.filter()或.reduce()。@TVBZ我现在添加了一个代码段(忘记了将索引字符串的大小写改为小写)。我不确定你的评论是什么意思,因为我肯定使用了filter()
我已经尝试过你的解决方案。这很有道理。但是由于某种原因,我仍然得到了和以前一样的结果。呵呵。我现在有点迷路了。你能看看我的表吗?搜索功能从规则260开始。在寻找奥尔森·塞拉斯时,我希望前两个联系人会回来。非常感谢@TVBZ问题在于你的另一种逻辑。只有当$input.length
为1
时,才可以对过滤后的数组执行任何操作。修复您的if…else如果…
逻辑,删除第一个else
Aaah。。对我非常专注于排序逻辑,而问题实际上在于返回逻辑。:)非常感谢@Phil。竖起大拇指!
const filteredArr = contactsArr.filter(contact => {
return Object.values(contact).some(x => {
if (typeof x === "number") x = x.toString();
return x.toLowerCase().includes($input);
});
});
const filteredArr = contactsArr.filter(contact => {
return Object.values(contact).some(x => {
// contact.id number to string
if (typeof x === "number") x = x.toString();
// match with lowercase (same as $input)
x = x.toLocaleLowerCase();
// check if includes and return true or false
return $input.some(word => x.includes(word));
});
});