假设我有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中快速完成这项工作?
答案 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
功能稍强的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);
答案 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;
}