如果存在匹配,JavaScript对两个数组(一个嵌套数组,一个扁平数组)的部分匹配应该返回true
JavaScript partial match on two arrays (one nested and one flat) should return true if any match exist
我需要通过给定数组"results"的每个节点进行部分匹配。匹配将需要解析原始输入字段中由空格分隔的每个字符串。以下是我基本需求的样品。
我有两组数组一个结果列表数组和一个输入字段数组给定:
如果输入搜索条件:"ABC pa 2014"-现在我存储在一个数组中,所以我可以使用indexOf。但是,它匹配的是每个空格分隔词的完整字符串。
Results List Array:
[
{
"sIndex": 0,
"sItem": {
"cName": "ABC Partners",
"cId": 0
}
},
{
"sIndex": 1,
"sItem": {
"cName": "ABC Partners",
"cId": 0,
"pName": "[ABC] ABC Description",
"pTick": "ABC",
"pId": 0,
"dName": "[2014] ABC Db",
"dYear": [
"2014"
],
"dId": 0
}
},
{
"sIndex": 2,
"sItem": {
"cName": "ABC Partners",
"cId": 0,
"pName": "[ABC] ABC Description Two",
"pTick": "ABC",
"pId": 0,
"dName": "[2014] ABC Db",
"dYear": [
"2014"
],
"dId": 0
}
},
用于测试的完整数组:
[{"sIndex":0,"sItem":{"cName":"ABC Partners","cId":0}},{"sIndex":1,"sItem":{"cName":"ABC Partners","cId":0,"pName":"[ABC] ABC Partners","pTick":"ABC","pId":0}},{"sIndex":2,"sItem":{"cName":"ABC Partners","cId":0,"pName":"[ABC] ABC Partners","pTick":"ABC","pId":0,"dName":"[2009] ABC Partners DB","dYear":"2009","dId":0}},{"sIndex":3,"sItem":{"cName":"ABC Partners","cId":0,"pName":"[ABC] ABC Partners","pTick":"ABC","pId":0,"dName":"[2009] Scenario 1 DB","dYear":"2009","dId":1}},{"sIndex":4,"sItem":{"cName":"ABC Partners","cId":0,"pName":"[ABC] ABC Partners","pTick":"ABC","pId":0,"dName":"[2009] Scenario 1 ExpResults DB","dYear":"2009","dId":2}},{"sIndex":5,"sItem":{"cName":"ABC Partners","cId":0,"pName":"[ABC] ABC Partners","pTick":"ABC","pId":0,"dName":"[2009] Scenario 2 DB","dYear":"2009","dId":3}},{"sIndex":6,"sItem":{"cName":"ABC Partners","cId":0,"pName":"[ABC] ABC Partners","pTick":"ABC","pId":0,"dName":"[2009] Scenario 2 ExpResults DB","dYear":"2009","dId":4}},{"sIndex":7,"sItem":{"cName":"ABC Partners","cId":0,"pName":"[ABC] ABC Partners","pTick":"ABC","pId":0,"dName":"[2009] Scenario 3 BaseDB","dYear":"2009","dId":5}},{"sIndex":8,"sItem":{"cName":"ABC Partners","cId":0,"pName":"[ABC] ABC Partners","pTick":"ABC","pId":0,"dName":"[2009] Scenario 3 DB","dYear":"2009","dId":6}},{"sIndex":9,"sItem":{"cName":"ABC Partners","cId":0,"pName":"[ABC] ABC Partners","pTick":"ABC","pId":0,"dName":"[2009] Scenario 3 ExpResults DB","dYear":"2009","dId":7}},{"sIndex":10,"sItem":{"cName":"ABC Partners","cId":0,"pName":"[ABC] ABC Partners","pTick":"ABC","pId":0,"dName":"[2009] Scenario 4 DB","dYear":"2009","dId":8}},{"sIndex":11,"sItem":{"cName":"ABC Partners","cId":0,"pName":"[ABC] ABC Partners","pTick":"ABC","pId":0,"dName":"[2009] Scenario 4 ExpResults DB","dYear":"2009","dId":9}},{"sIndex":12,"sItem":{"cName":"ABC Partners","cId":0,"pName":"[ABC] ABC Partners","pTick":"ABC","pId":0,"dName":"[2009] Scenario 5 DB","dYear":"2009","dId":10}},{"sIndex":13,"sItem":{"cName":"ABC Partners","cId":0,"pName":"[ABC] ABC Partners","pTick":"ABC","pId":0,"dName":"[2009] Scenario 5 ExpResults DB","dYear":"2009","dId":11}},{"sIndex":14,"sItem":{"cName":"ABC Partners","cId":0,"pName":"[ABC] ABC Partners","pTick":"ABC","pId":0,"dName":"[2010] Scenario 6 DB","dYear":"2010","dId":12}},{"sIndex":15,"sItem":{"cName":"ABC Partners","cId":0,"pName":"[ABC] ABC Partners","pTick":"ABC","pId":0,"dName":"[2010] Scenario 6 ExpResults DB","dYear":"2010","dId":13}},{"sIndex":16,"sItem":{"cName":"ABC Partners","cId":0,"pName":"[ABC] ABC Partners","pTick":"ABC","pId":0,"dName":"[2009] Scenario 7 DB","dYear":"2009","dId":14}},{"sIndex":17,"sItem":{"cName":"ABC Partners","cId":0,"pName":"[ABC] ABC Partners","pTick":"ABC","pId":0,"dName":"[2009] Scenario 7 ExpResults DB","dYear":"2009","dId":15}},{"sIndex":18,"sItem":{"cName":"ABC Partners","cId":0,"pName":"[ABC] ABC Partners","pTick":"ABC","pId":0,"dName":"[2009] Scenario 8 BaseDB","dYear":"2009","dId":16}},{"sIndex":19,"sItem":{"cName":"ABC Partners","cId":0,"pName":"[ABC] ABC Partners","pTick":"ABC","pId":0,"dName":"[2009] Scenario 8 DB","dYear":"2009","dId":17}},{"sIndex":20,"sItem":{"cName":"ABC Partners","cId":0,"pName":"[ABC] ABC Partners","pTick":"ABC","pId":0,"dName":"[2009] Scenario 8 ExpResults DB","dYear":"2009","dId":18}}]
函数应该返回第二个和第三个节点。
,如果输入搜索词:"ABC pa",函数应该返回所有三个节点。
我为这个问题的简短道歉,任何帮助都将是非常感激的。
步骤
- 按空格将搜索输入拆分为单词数组。
- 使用
Array.prototype.filter
方法对源数组进行过滤 - 循环遍历源数组中每一项的
sItem
属性,并:- 查看属性是否为
String
,如果为true- 遍历搜索的单词,看看它们是否在该属性 中找到
- 查看属性是否为
- 如果在属性中找到了所有单词,则向
filter
方法返回true
function search(val) {
val = val.split(' '); // Step 1
var filtered = arr.filter(function(item) { // Step 2
var found = []; // Array to save how many words were found
for (var prop in item.sItem) { // Step 3
if (typeof item.sItem[prop] === 'string') { // Step 3.1
for (var i = 0; i < val.length; i++) { // Step 3.1.1
// Look if the current property has any of the words of the search input
if (item.sItem[prop].toLowerCase().indexOf(val[i].toLowerCase()) >= 0) {
found[i] = true; // if found, save to the found array
}
}
}
}
// if the true values of the found array has the same length of the input search array
return found.filter(function(expr) { return expr; }).length == val.length; // Step 4
});
// sort the filtered array by the dName property and return it
return filtered.sort(function(a, b) {
return b.sItem.dName > a.sItem.dName;
});
}
查看下面的
(function(d) {
d.getElementById('search').addEventListener('input', function(e) {
var result = search(this.value);
d.querySelector('result').innerHTML = JSON.stringify(result, null, 2);
});
var arr = [{"sIndex":0,"sItem":{"cName":"ABC Partners","cId":0}},{"sIndex":1,"sItem":{"cName":"ABC Partners","cId":0,"pName":"[ABC] ABC Partners","pTick":"ABC","pId":0}},{"sIndex":2,"sItem":{"cName":"ABC Partners","cId":0,"pName":"[ABC] ABC Partners","pTick":"ABC","pId":0,"dName":"[2009] ABC Partners DB","dYear":"2009","dId":0}},{"sIndex":3,"sItem":{"cName":"ABC Partners","cId":0,"pName":"[ABC] ABC Partners","pTick":"ABC","pId":0,"dName":"[2009] Scenario 1 DB","dYear":"2009","dId":1}},{"sIndex":4,"sItem":{"cName":"ABC Partners","cId":0,"pName":"[ABC] ABC Partners","pTick":"ABC","pId":0,"dName":"[2009] Scenario 1 ExpResults DB","dYear":"2009","dId":2}},{"sIndex":5,"sItem":{"cName":"ABC Partners","cId":0,"pName":"[ABC] ABC Partners","pTick":"ABC","pId":0,"dName":"[2009] Scenario 2 DB","dYear":"2009","dId":3}},{"sIndex":6,"sItem":{"cName":"ABC Partners","cId":0,"pName":"[ABC] ABC Partners","pTick":"ABC","pId":0,"dName":"[2009] Scenario 2 ExpResults DB","dYear":"2009","dId":4}},{"sIndex":7,"sItem":{"cName":"ABC Partners","cId":0,"pName":"[ABC] ABC Partners","pTick":"ABC","pId":0,"dName":"[2009] Scenario 3 BaseDB","dYear":"2009","dId":5}},{"sIndex":8,"sItem":{"cName":"ABC Partners","cId":0,"pName":"[ABC] ABC Partners","pTick":"ABC","pId":0,"dName":"[2009] Scenario 3 DB","dYear":"2009","dId":6}},{"sIndex":9,"sItem":{"cName":"ABC Partners","cId":0,"pName":"[ABC] ABC Partners","pTick":"ABC","pId":0,"dName":"[2009] Scenario 3 ExpResults DB","dYear":"2009","dId":7}},{"sIndex":10,"sItem":{"cName":"ABC Partners","cId":0,"pName":"[ABC] ABC Partners","pTick":"ABC","pId":0,"dName":"[2009] Scenario 4 DB","dYear":"2009","dId":8}},{"sIndex":11,"sItem":{"cName":"ABC Partners","cId":0,"pName":"[ABC] ABC Partners","pTick":"ABC","pId":0,"dName":"[2009] Scenario 4 ExpResults DB","dYear":"2009","dId":9}},{"sIndex":12,"sItem":{"cName":"ABC Partners","cId":0,"pName":"[ABC] ABC Partners","pTick":"ABC","pId":0,"dName":"[2009] Scenario 5 DB","dYear":"2009","dId":10}},{"sIndex":13,"sItem":{"cName":"ABC Partners","cId":0,"pName":"[ABC] ABC Partners","pTick":"ABC","pId":0,"dName":"[2009] Scenario 5 ExpResults DB","dYear":"2009","dId":11}},{"sIndex":14,"sItem":{"cName":"ABC Partners","cId":0,"pName":"[ABC] ABC Partners","pTick":"ABC","pId":0,"dName":"[2010] Scenario 6 DB","dYear":"2010","dId":12}},{"sIndex":15,"sItem":{"cName":"ABC Partners","cId":0,"pName":"[ABC] ABC Partners","pTick":"ABC","pId":0,"dName":"[2010] Scenario 6 ExpResults DB","dYear":"2010","dId":13}},{"sIndex":16,"sItem":{"cName":"ABC Partners","cId":0,"pName":"[ABC] ABC Partners","pTick":"ABC","pId":0,"dName":"[2009] Scenario 7 DB","dYear":"2009","dId":14}},{"sIndex":17,"sItem":{"cName":"ABC Partners","cId":0,"pName":"[ABC] ABC Partners","pTick":"ABC","pId":0,"dName":"[2009] Scenario 7 ExpResults DB","dYear":"2009","dId":15}},{"sIndex":18,"sItem":{"cName":"ABC Partners","cId":0,"pName":"[ABC] ABC Partners","pTick":"ABC","pId":0,"dName":"[2009] Scenario 8 BaseDB","dYear":"2009","dId":16}},{"sIndex":19,"sItem":{"cName":"ABC Partners","cId":0,"pName":"[ABC] ABC Partners","pTick":"ABC","pId":0,"dName":"[2009] Scenario 8 DB","dYear":"2009","dId":17}},{"sIndex":20,"sItem":{"cName":"ABC Partners","cId":0,"pName":"[ABC] ABC Partners","pTick":"ABC","pId":0,"dName":"[2009] Scenario 8 ExpResults DB","dYear":"2009","dId":18}}]
function search(val) {
val = val.split(' ');
var filtered = arr.filter(function(item) {
var found = [];
for (var prop in item.sItem) {
if (typeof item.sItem[prop] === 'string') {
for (var i = 0; i < val.length; i++) {
if (item.sItem[prop].toLowerCase().indexOf(val[i].toLowerCase()) >= 0) {
found[i] = true;
}
}
}
}
return found.filter(function(expr) { return expr; }).length == val.length;
});
return filtered.sort(function(a, b) {
return b.sItem.dName > a.sItem.dName;
});
}
})(document);
result {
display: block;
white-space: pre;
font-family: Courier New;
font-size: 12px;
}
<input type="text" id="search" />
<result></result>
相关文章:
- Javascript(Angular)从一个对象数组到第二个数组查找值
- 根据id将json数组组合为一个json数组
- JavaScript数组包含一个值
- 对一个对象使用reduce可以返回一个没有't在数组中包含目标字母
- jQuery$.inArray()总是返回-1和一个对象数组
- 在数组中的一个元素上设置多个值
- javascript处理一个对象数组以获得一个新的对象数组
- 作为一个二维数组,从ajax接收
- 你能用来自数组的属性名称生成一个对象吗
- 多维关联数组的最后一个索引
- 如何创建一个方法来验证数组的范围
- 循环以检查数组中的最后一个图像
- 在Javascript中将一个值和字符串数组转换为if语句
- 算法:从数组(javascript/angular)中按当前日期获取上一个和下一个事件
- 如何将一个对象添加到每个对象数组中
- 如何创建一个谷歌地图地理坐标数组
- 如何从另一个带下划线的数组中筛选带元素的数组
- 使用window.location.htm和匹配的URL数组(一个用于桌面,一个用于移动)将桌面网站重定向到移动
- Javascript排序多维数组-一个完整的例子
- 刽子手的游戏.2数组.一个需要相应地更新另一个