Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用layered.reduce()或.filter()函数,基于单独的搜索数组查找对象数组中的对象?_Javascript_Jquery - Fatal编程技术网

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));
            });
        });