![](/img/trans.png)
[英]Javascript variable to dynamically change based on value of DOM that matches object pairs
[英]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>
具有某些数组方法(例如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.