我有jQuery,所以如果它有用,那就可以了。
首先是一个简单的问题:
有没有办法检查几个变量是否都相等?
我可以使用传递关系逻辑并执行
if ((a == b) && (b == c)) && (c == d)) ... {
避免检查每个变量与其他变量,但我认为应该有更好的方法来做到这一点。
如果您只能回答第一部分,我们将不胜感激。
现在,棘手的部分...... 我有一个可变数量的变量(1到5之间) 我知道它们的值可以是来自DDBB的200个可能值中的任何一个。
知道这些变量中每个值的实例数量的最佳方法是什么?
例如......
如果我有......
var1 = VALUE_A;
var2 = VALUE_A;
var3 = VALUE_B;
var4 = VALUE_Z;
var5 = VALUE_Z;
...我希望得到类似的东西:
result["VALUE_A"] => 2
result["VALUE_B"] => 1
result["VALUE_Z"] => 2
/////////////////////////// 如果我有......或者
var1 = VALUE_A;
var2 = VALUE_C;
var3 = VALUE_B;
...得到:
result["VALUE_A"] => 1
result["VALUE_C"] => 1
result["VALUE_B"] => 1
/////////////////////////// 如果我有......或者
var1 = VALUE_A;
var2 = VALUE_A;
var3 = VALUE_A;
var4 = VALUE_C;
var5 = VALUE_C;
...得到:
result["VALUE_A"] => 3
result["VALUE_C"] => 2
/////////////////////////// 如果我有......或者
var1 = VALUE_A;
var2 = VALUE_A;
var3 = VALUE_A;
...得到:
result["VALUE_A"] => 3
希望我很清楚。例子是我能想到解释清楚的唯一方法。 如果这对于Javascript或处理来说过于复杂,那么很多可能的值可能会使浏览器变慢,我可以在PHP中完成并通过AJAX获得结果,但我宁愿不这样做。
答案 0 :(得分:3)
会这样吗?
function countOccurrences(arr) {
var result = {};
$.each(arr, function(index, value) {
if (!result[value])
result[value] = 1;
else
result[value]++;
});
return result;
}
此函数接受值的数组,并返回一个对象,其键是元素,值是每个对象的出现次数。
答案 1 :(得分:0)
对于你的第一个问题,我认为没有任何特殊方法可以做到这一点。
对于第二个:我建议将这些变量存储在一个数组中。所以你的代码变成了:
var myVars = [];
myVars[0] = VALUE_A;
myVars[1] = VALUE_A;
myVars[2] = VALUE_B;
myVars[3] = VALUE_Z;
myVars[4] = VALUE_Z;
然后,您只需循环遍历数组并计算每个值的出现次数。
答案 2 :(得分:0)
我认为你需要创建自己的对象。该对象基本上是键/值对数组的包装器。那么你需要几个.isTrue()或其他方法。
那么为什么不向Array对象添加你自己的方法和属性来完成工作....希望它足够清楚。
KeyValuePair.prototype.value = null;
KeyValuePair.prototype.key = null;
function KeyValuePair(key, value) {
this.key = key;
this.value = value;
this.Equals = Equals;
function Equals(o) {
if (this.value == o.value)
return true;
else
return false;
}
}
Array.prototype.ValuesAreEqual = ValuesAreEqual;
Array.prototype.GetValues = GetValues;
function ValuesAreEqual() {
this.sort();
for (var i = 0; i <= this.length - 1; i++) {
var last = this.pop();
var first = this.shift();
if (first) {
return first.Equals(last);
}
}
}
function GetValues(value) {
var arr = new Array();
if (this.length > 0) {
for (var i = 0; i <= this.length - 1; i++) {
if (this[i].value) {
if (this[i].value == value) {
arr.push(this[i].value);
}
}
}
}
return arr;
}
//code below would demonstrate the functionality of the above.
var x = new Array();
x.push(new KeyValuePair("A","Hello"));
x.push(new KeyValuePair("B","Hello"));
x.push(new KeyValuePair("C","Hello"));
var y = x.GetValues("Hello");
document.writeln(y.length);
document.writeln('\r\n');
document.writeln(x.ValuesAreEqual());
答案 3 :(得分:0)
回答第一个问题。
如果要比较很多变量,这个功能可能会有所帮助。
function allEq(arr)
{
var next;
var curr = arr.pop();
while (arr.length)
{
next = arr.pop();
if (curr != next)
return false;
curr = next;
}
return true;
}
var a = 1, b = 1, c = 1, d = 1;
var myArr = [a, b, c, d];
if (allEq(myArr)) ... {
答案 4 :(得分:0)
简短的回答是否定的,这是不可能的。 JavaScript允许无法从环境中提取的局部变量定义。
长期答案更加细致入微。声明没有var
的变量或在窗口上声明正确的变量通常是可访问的,但这样做很令人头疼。并且您通常可以通过eval获取变量的值,但仍然无法访问变量的名称(这是您需要的所有内容)。
如果您有一系列已知值,那么您可以遍历变量:
var tests = [
VALUE_A,
VALUE_B,
VALUE_A,
VALUE_C
]
function areAllEqual( arr )
{
for( var i = 0; i < arr.length - 1; i++ )
{
if( arr[ i ] != arr[ i + 1 ] ) return false;
}
return true;
}
console.log( areAllEqual( tests ) ) // false;
console.log( areAllEqual( [1,1,1] ) ) // true;
function getOccurances(arr) {
var result = {};
for( var i = 0; i < arr.length; i++ )
{
if( isNaN( result[ arr[ i ] ] ) ) result[ arr[ i ] ] = 1;
else result[ arr[ i ] ]++;
}
return result;
}
// this is not guaranteed to be in any order.
console.log( getOccurances( tests ) ) // {VALUE_A:2, VALUE_B:1, VALUE_C:1};