如何检查对象之间的字段值(存储在关联数组中)是否相等?

时间:2016-04-21 13:35:54

标签: javascript jquery arrays object lodash

假设我有this代码:

You have clicked me 1 times.

我需要检查所有字段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; Tipologia是否相同。

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

相反,tipo1应该返回CheckArrayLavorazione()(它们不是全部false,而是lavoro1。)

你会如何在Javascript / jQuery中快速完成这项工作?

5 个答案:

答案 0 :(得分:2)

这解决了您的问题:

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

答案 1 :(得分:1)

首先,我建议使用数组存储对象 - 如果您需要从其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

答案 2 :(得分:0)

您可以尝试使用every功能

进行检查
var patternID = 'id1';

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

改变@GG解决方案,使其更快

function CheckArrayTipologia() {
    var lastTipologia;

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

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

    return true;
}