【问题标题】:How to check if fields values between objects (stored within an associative array) are equal?如何检查对象之间的字段值(存储在关联数组中)是否相等?
【发布时间】:2016-04-21 13:35:54
【问题描述】:

假设我有this 代码:

var denti={}

function Dente() {
    this.ID = "";
    this.Tipologia = "";
    this.Lavorazione = "";
}

var dente = new Dente();
dente.ID="id1";
dente.Tipologia="tipo1";
dente.Lavorazione="lavoro1";
denti[dente.ID] = dente;

dente = new Dente();
dente.ID="id2";
dente.Tipologia="tipo1";
dente.Lavorazione="lavoro2";
denti[dente.ID] = dente;

dente = new Dente();
dente.ID="id3";
dente.Tipologia="tipo1";
dente.Lavorazione="lavoro1";
denti[dente.ID] = dente;

我需要检查所有字段 TipologiaLavorazione 是否相同。

在这种情况下,我要求CheckArrayTipologia() 的函数应该返回true(所有.Tipologia 字段值都相同,tipo1)。

相反,CheckArrayLavorazione() 应该返回false(它们不都是lavoro1,还有一个lavoro2)。

你如何在 Javascript/jQuery 中快速做到这一点?

【问题讨论】:

  • 你没有发布CheckArrayTipologia(),所以谁能说如何让它“更快”?
  • CheckArrayTipologia() 是我问你的功能:)
  • 你会如何更快地做到这一点 - 比什么更快?没有代码。 编辑啊。
  • 对不起,错字!我的意思是快。
  • 您所能做的就是遍历所有对象并检查属性。我会在 Array 原型上使用 Object.keys().every() 方法。

标签: javascript jquery arrays object lodash


【解决方案1】:

这解决了你的问题:

function CheckArrayTipologia() {
    var tipologia;

    for (dente in denti) {
        if (!tipologia) {
            tipologia = dente.Tipologia;
            continue;
        }

        if (tipologia !== dente.Tipologia) {
            return false;
        }
    }

    return true;
}

DEMO

或者使用 Lodash,更短:

function CheckArrayTipologia() {
    var values = _.values(denti);
    return _.every(values, 'Tipologia', _.first(values).Tipologia);
}

DEMO

【讨论】:

    【解决方案2】:

    首先,我建议使用数组来存储您的对象 - 如果您需要从其 id 获取对象,您可以使用 filter

    var denti = [];
    

    我已经重写了您的构造函数,以便您传入一个 param 对象并将其属性设置为新的对象属性:

    function Dente(params) {
      for (var p in params) {
        this[p] = params[p];
      }
    }
    

    现在只需定义一个新对象并立即将其推送到数组中:

    denti.push(new Dente({
      id: 'id1',
      Tipologia: 'tipo1',
      Lavorazione: 'lavoro1'
    }));
    

    然后您可以编写一个通用函数,将您的数组和您要检查的对象的属性传递给该函数:

    function checkSame(arr, prop) {
      if (!arr.length) return false;
    
      // extract the property values from each object
      return arr.map(function (el) {
        return el[prop];
    
      // Check if they're all the same
      }).every(function (el, i, arr) {
        return el === arr[0];
      });
    }
    
    checkSame(denti, 'Tipologia'); // true
    checkSame(denti, 'Lavorazione'); // false
    

    DEMO

    或者功能性更强的 JS (ES6):

    const pick = (prop) => obj => obj[prop];
    const same = (el, i, arr) => el === arr[0];
    const checkSame = (arr, prop) => arr.map(pick(prop)).every(same);
    

    DEMO

    【讨论】:

      【解决方案3】:

      您可以尝试使用every函数检查

      var patternID = 'id1';
      
      var res = Object.keys(denti).every(id => 
          denti[id].Lavorazione == denti[patternID].Lavorazione &&
          denti[id].Tipologia == denti[patternID].Lavorazione);
      

      【讨论】:

        【解决方案4】:

        如果你不介意使用 Underscore.js,那么你可以这样做:

        var tipologias = _.map(denti, function(d) { 
            return d.Tipologia; 
        });
        var areAllTipologiasEqual = _.uniq(tipologias).length === 1;
        

        【讨论】:

          【解决方案5】:

          对@GG 解决方案的一点改动,使其更快

          function CheckArrayTipologia() {
              var lastTipologia;
          
              for (dente in denti) {
                  if (!lastTipologia) {
                      lastTipologia = dente.Tipologia;
                      continue;
                  }
          
                  if (lastTipologia !== dente.Tipologia) {
                      return false;
                  }
              }
          
              return true;
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2019-03-04
            • 2015-10-09
            • 2023-03-11
            • 2012-06-10
            • 1970-01-01
            • 1970-01-01
            • 2017-03-09
            • 1970-01-01
            相关资源
            最近更新 更多