javascript - 检查 JS 对象是否匹配值的最佳方法

标签 javascript optimization

我需要扩展(从 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;
}

就像我说的,它并不能完全解决您的问题 - 主要是因为有很多细节可能会改变最终结果。

Here is a jsbin with it working as outlined.

关于javascript - 检查 JS 对象是否匹配值的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35188543/

相关文章:

javascript - 将回复电子邮件地址更改为动态 crm 2011 中队列的电子邮件地址

javascript - Javascript 代码仅在我将其放在正文部分时才有效

jQuery:滑动切换 ||代码有什么优化吗?

javascript - jQuery 链接以创建连接字符串

javascript - 从 Node API 端点解析表达式( bool 值)

javascript - AngularJS,使用 Rest 服务,该服务以 Array<Object> 进行响应。如何在表格中显示这一点?

jquery-ui - 在对话框显示上延迟加载 OpenLayers map ?

performance - 为什么循环总是编译成 “do…while”样式(尾跳)?

r - 在自定义 R 函数中预分配内存以提高性能(使用 dplyr)

javascript 未捕获类型错误 : Cannot read property 'firstChild' of null