我需要扩展(从 2 到最多 10)并优化一些模型导入,但我只是想不出一个好方法来检查 javascript 对象是否匹配除了大量 if 语句之外的值, 所以我想我应该在这里问一下,看看是否有经验丰富的 js 开发人员知道一个好的、轻量级的方法来完成这个任务..
基本结构:
//a is the object, it contains some basic, unrelated information and
//either 2, 6 or 10 id's & id2's
//unused id's have a value of 0.
//Sorry for the faulty variables, i was in a rush and just needed to show that xid & xid2 fit together and yid & yid2 fit together, etc.
//input 1
a.1Id = x; //Primary, Desides the actual model to import
a.1Id2 = y; //Secondary, Desides version of the model, specific colours, features, etc
//input 2
a.2Id = z;
a.2Id2 = x;
(最多 10 个输入,a.10Id 和 Id2)
现在,我需要检查匹配项..
如果1Id与2Id相同且1Id2与2Id2相同,则仅导入模型一次。
当只有两个模型输入时,就相当简单了。
//the import is not actually structured as var importX,
//they are pushed to another object and then the loader loads each of them with a for..loop
if (a.1Id === a.2Id && a.1Id2 === a.2Id2){
var import1 = a.1Id;
var import12 = a.1Id2;
} else {
var import1 = a.1Id;
var import12 = a.1Id2;
var import2 = a.2Id;
var import22 = a.2Id2;
}
但除此之外,你可以想象它开始变得相当繁重的 if 语句来检查有多少个以及是否有任何一个是相同的..
所以总而言之,我基本上希望可以使用某种函数或算法来检查所有 xId 和 xId2 输入值是否与其他任何一个匹配,然后仅发送其中一个将输入匹配到加载器,从而避免多次导入相同的模型。
最佳答案
还有很多问题没有得到解答,因此这里将每个 Id[n] 与下一个 Id[n+1] 进行比较。它并不能完全解决问题,但应该为您指明正确的方向。
我必须更改您的对象,因为对象属性不能以数字开头。我还做了一些假设,例如这些值实际上是字符串(因为当您在示例中呈现它们时,它们实际上是变量)。
var a = {
Id1_: '1',
Id1_2: '1a',
Id2_: '1',
Id2_2: '2a',
Id3_: '3',
Id3_2: '3a',
Id4_: '1',
Id4_2: '1a',
Id5_: '2',
Id5_2: '2a',
Id6_: '3',
Id6_2: '3a',
Id7_: '2',
Id7_2: '2a',
Id8_: '3',
Id8_2: '3a',
Id9_: '1',
Id9_2: '1a',
Id10_: '1',
Id10_2: '2a'
};
我做的第一件事是从 a
获取 Object.keys
,因为这将允许我迭代所有键,而无需提前知道它们可能是什么。
var k1 = Object.keys(a);
然后我将对象和键传递给函数:
checkMatches(k1, a);
该函数按顺序检查对象,将第一个键与第二个键进行比较,将第二个键与第三个键进行比较,依此类推 - 推送与数组中另一个不匹配的任何键。我 console.log
每次比较涉及的键。这是函数。
function checkMatches(k, o){
var results = [];
var s = "Id", f = "_";
var nextId = 2;
var idCnt = 0;
var propt = "";
for (var i = 0; i < k.length; i++){
idCnt += 1;
if (idCnt === 3) {
idCnt = 1;
nextId += 1;
}
propt = s + nextId + f;
if (idCnt === 2) {
propt += "2";
}
console.log(k[i] + ": " + o[k[i]] + " vs " + propt + ": " + o[propt]);
if (o[k[i]] !== o[propt]) {
results.push({ id: k[i], value: o[k[i]] });
}
}
return results;
}
就像我说的,它并不能完全解决您的问题 - 主要是因为有很多细节可能会改变最终结果。
关于javascript - 检查 JS 对象是否匹配值的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35188543/