繁体   English   中英

如何最好地“动态”使javascript有条件根据多个可能的键值对找到匹配项? 寻找解决方案

[英]How to best “dynamically” make javascript have an conditional to find matches based on multiple possible key value pairs? Looking for a solution

如何最有效地构造“条件”对象以在对象列表(由键值对组成)中查找匹配项并将其添加到“匹配项”列表中?

我有一个包含多个对象的以下testList:

var testList = {
  "A": "SUBA1",
  "B": "SUBB2",
  "C": "SUBC5",
},
{
  "A": "SUBA2",
  "B": "SUBB3",
  "C": "SUBC1",
}
...
]

现在,我的具有一个条件的matchCondition很简单地专注于一个键和值:

var matchCondition = {"key": "A", val:"SUBA1"};

我想将testList中与我的“ matchCondition”匹配的任何单个对象推入“ matchedList”。

var matchedList = [];

因此,我现在使用“ findMatches”函数执行此操作:

function findMatches(matchCondition, testList) {
var matchedList = [];
for(var i = 0; i < testList.length; i++) {
   if(testList[matchCondition[key]] == testList[i][matchCondition[val]]) {
       matchedList.push(testList[i]);
   }
}
return matchedList;
}

我的问题是,如果我想使用多个条件进行匹配,例如“ A”可能等于“ SUBA1”或“ SUBA2”,而“ B”是“ SUBB2”,而“ C”是“ SUBB5”,该怎么办:

也许物体看起来像这样?

var matchCondition = {
  "A": ["SUBA1", "SUBA2"],
  "B": ["SUBB2"],
  "C": ["SUBC5"]
}

我不确定什么可以更新我的findMatches函数使其更健壮的最佳方法是什么?或者我如何最好地构造“ matchCondition”以能够支持我要匹配的多个键值?

您可以迭代马赫条件对象hasOwnProperty()并检查其值是否符合要求。

 var testList = [{ "A": "SUBA1", "B": "SUBB2", "C": "SUBC5", }, { "A": "SUBA2", "B": "SUBB3", "C": "SUBC1", }]; var matchCondition = { "A": ["SUBA1", "SUBA2"], "B": ["SUBB2"], "C": ["SUBC5"] } function findMatches(testList, matchCondition) { return testList.filter(function(obj){ for (var key in matchCondition) { if (matchCondition.hasOwnProperty(key) && obj.hasOwnProperty(key)) { if( matchCondition[key].indexOf(obj[key]) == -1){ return false; } }else{ return false; } } return true }); } snippet.log(JSON.stringify(findMatches(testList, matchCondition))) 
 <!-- Provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 --> <script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script> 

良好的Javascript迭代对象

具有某些数组方法(例如Array.prototype.filter()Array.prototype.every()以及Object.keys()的提案。

 var testList = [{ "A": "SUBA1", "B": "SUBB2", "C": "SUBC5", }, { "A": "SUBA2", "B": "SUBB3", "C": "SUBC1", }], matchCondition = { "A": ["SUBA1", "SUBA2"], "B": ["SUBB2"], "C": ["SUBC5"] }; function filter(data, condition) { return data.filter(function (a) { return Object.keys(condition).every(function (k) { return ~condition[k].indexOf(a[k]); }); }); } document.write('<pre>' + JSON.stringify(filter(testList, matchCondition), 0, 4) + '</pre>'); 

目前尚不清楚您期望得到什么,但是这里有一个可能的ES6解决方案。 根据您的多条件matchCondition示例。

 'use strict'; var testList = [{ "A": "SUBA1", "B": "SUBB2", "C": "SUBC5", }, { "A": "SUBA2", "B": "SUBB3", "C": "SUBC1", }]; var matchCondition = { "A": ["SUBA1", "SUBA2"], "B": ["SUBB2"], "C": ["SUBC5"] }; var matchedList = []; for (let item of testList) { let x = Object.create(null); for (let key of Object.keys(matchCondition)) { let val = item[key]; if (val) { for (let sub of matchCondition[key]) { if (sub === val) { x[key] = sub; break; } } } } matchedList.push(x); } document.getElementById('out').textContent = JSON.stringify(matchedList, null, 2); console.log(matchedList); 
 <pre id="out"></pre> 

或类似的ES5

 'use strict'; var testList = [{ "A": "SUBA1", "B": "SUBB2", "C": "SUBC5", }, { "A": "SUBA2", "B": "SUBB3", "C": "SUBC1", }]; var matchCondition = { "A": ["SUBA1", "SUBA2"], "B": ["SUBB2"], "C": ["SUBC5"] }; var matchedList = testList.reduce(function(acc, item) { var x = Object.create(null); Object.keys(matchCondition).forEach(function(key) { var val = item[key]; if (val) { matchCondition[key].some(function(sub) { if (sub === val) { x[key] = sub; return true; } }); } }); acc.push(x); return acc; }, []); document.getElementById('out').textContent = JSON.stringify(matchedList, null, 2); console.log(matchedList); 
 <pre id="out"></pre> 

这些不是唯一的可能性,但是您需要更加清楚自己的期望,并且最好能看到自己尝试过的东西以及遇到问题的地方。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM