Javascript 如何过滤对象中的每个数据
我在一个名为Javascript 如何过滤对象中的每个数据,javascript,jquery,Javascript,Jquery,我在一个名为value的变量中存储了一个输入值 var value=$("#globalSearch").val().trim(); 我有一个名为jsonData的对象 0:{name:"xxxx",age:"20",gender:"male"}; 1:{name:"yyy",age:"22",gender:"female"}; 2:{name:"zzz",age:"20",gender:"female"} 现在,我只根据name及其工作状况过滤数据 var Data={};
value
的变量中存储了一个输入值
var value=$("#globalSearch").val().trim();
我有一个名为jsonData
的对象
0:{name:"xxxx",age:"20",gender:"male"};
1:{name:"yyy",age:"22",gender:"female"};
2:{name:"zzz",age:"20",gender:"female"}
现在,我只根据name
及其工作状况过滤数据
var Data={};
var value=$("#globalSearch").val().trim();
$.each(jsonData,function(i,d){
debugger;
if(value && d.value.toLowerCase().indexOf(value.toLowerCase())==-1)
{
return;
}
if(!Data[d.age])
{
Data[d.age]=[];
}
Data[d.age].push(d);
});
return Data
现在我的问题是,当我输入时,它将只检查姓名,但我想检查年龄和性别。怎么做
我试过这样做
if(value && d.value&&age&&gender.toLowerCase().indexOf(value.toLowerCase())==-1)
它不起作用了。请告诉我任何想法。你可以使用。因为你需要检查所有3个过滤器,你可以做
最后,您将拥有一个数组,其中元素通过所有3个过滤器&
&
是一个逻辑运算符。您需要进行连接
我建议对元素数组使用join
,以执行连接:
if(value &&
[d.value, d.age, d.gender].join('|').toLowerCase().indexOf(value.toLowerCase())==-1)
如果您有ES6支持,您可以执行以下操作:
if(value &&
!Object.values(d).join('|').toLowerCase().includes(value.toLowerCase()))
。。。它将连接
d
对象中的所有可用值。&&
是一个逻辑运算符。您需要进行连接
我建议对元素数组使用join
,以执行连接:
if(value &&
[d.value, d.age, d.gender].join('|').toLowerCase().indexOf(value.toLowerCase())==-1)
如果您有ES6支持,您可以执行以下操作:
if(value &&
!Object.values(d).join('|').toLowerCase().includes(value.toLowerCase()))
。。。这将连接
d
对象中的所有可用值。因此,您要筛选与特定姓名、年龄和性别匹配的广告吗?@marvel308 yes。能帮我吗?jsonData也是数组吗?它是一个数组。&&
是一个逻辑运算符。你需要用括号代替+
:(d.value+d.age+d.gender)。toLowerCase()
,添加一个不常见的分隔符也不会有任何影响。所以你想过滤与特定姓名、年龄和性别匹配的广告吗?@marvel308 yes。能帮我吗?jsonData也是数组吗?它是一个数组。&&
是一个逻辑运算符。你需要用括号代替+
:(d.value+d.age+d.gender).toLowerCase()
,添加一个不常见的分隔符也不会有任何影响。为什么我们需要添加.join(|“”)这是为了防止匹配会跨越两个值。想象有人在输入中输入x2
。然后,如果没有连接,而是与+
进行简单的连接,则它将部分与值
属性(xxxx
)匹配,部分与年龄
属性(20
)匹配。(我想)你不会想要的。由于人们不会很快在搜索字符串中输入管道,因此在连接字符串中保留这些属性值是合适的字符。如果我将johnsena
作为输入,它应该返回完全匹配的数据,如果我把jo
作为输入,它应该什么也不返回。但是在我的示例中,我得到的响应都是从jo
开始的。我不想这样(我只想精确匹配)。有什么简单的方法可以做到这一点吗?我编写了这样的条件if(value&&d.name.toLowerCase().indexOf(value.toLowerCase())==-1&&d.age.toLowerCase()!=value.toLowerCase()&&d.gender.toLowerCase()!=value.toLowerCase())
工作正常。我想要更简单的代码来实现这个条件。当然,但是你对另外两个字段(不是indexOf
,而是!=
)应用了与你在问题中暗示的不同的规则。为什么我们需要添加.join(|“”)这是为了防止匹配会跨越两个值。想象有人在输入中输入x2
。然后,如果没有连接,而是与+
进行简单的连接,则它将部分与值
属性(xxxx
)匹配,部分与年龄
属性(20
)匹配。(我想)你不会想要的。由于人们不会很快在搜索字符串中输入管道,因此在连接字符串中保留这些属性值是合适的字符。如果我将johnsena
作为输入,它应该返回完全匹配的数据,如果我把jo
作为输入,它应该什么也不返回。但是在我的示例中,我得到的响应都是从jo
开始的。我不想这样(我只想精确匹配)。有什么简单的方法可以做到这一点吗?我编写了这样的条件if(value&&d.name.toLowerCase().indexOf(value.toLowerCase())==-1&&d.age.toLowerCase()!=value.toLowerCase()&&d.gender.toLowerCase()!=value.toLowerCase())
工作正常。我想要更简单的代码来实现这个条件。当然,但是你对另外两个字段(不是indexOf
,而是!=
)应用的规则与你在问题中暗示的不同。