0

我需要以下两个代码
1)选择所有以“示例”开头的变量
的代码 2)选择所有具有“真”作为“可用”值的变量的代码

example1= {price:1000, size: 1000, available:true}
example2= {price:2000, size: 2000, available:false}
example3= {price:3000, size: 3000, available:true}
example4= {price:4000, size: 4000, available=true}

这就是我想通过代码一实现的目标。由于有很多变量,我需要一种快速的方法:

var allexampleprices=[example1.price, example2.price, example3.price, example4.price]

使用第二个代码,我想获得一个包含所有包含值“false”的变量名称的数组

任何帮助表示赞赏!

4

3 回答 3

1

假设您不在函数中,所有这些都是完全相同的:

var myVar       = 7;
window.myVar    = 7;
window["myVar"] = 7;

因此,您可以使用 window[ insertString ] 方法访问任何全局变量(在函数外部定义的变量)。如果您想搜索 window 对象上的每个属性以找到一个名为 example,您可以这样做:

for( var k in window ){
  if(/example/.test(k)){
    var myExample = window[k];
    // Do stuff
  }
}

不过,出于多种原因,我强烈建议不要使用这种方法。首先,将任何东西放在全局范围内是一种非常糟糕的做法。变量将开始在大型项目中到处发生冲突。此外,window 对象有很多属性,搜索所有这些属性是一个可怕的性能消耗。

说了这么多,我已经设计了一个你应该做什么的例子,包括帮助函数:

var objects =
{
  example1:
  {
    price: 1000,
    size: 1000,
    available: true
  },

  example2:
  {
    price: 2000,
    size: 2000,
    available: false
  },

  example3:
  {
    price: 3000,
    size: 3000,
    available: true
  },

  example4:
  {
    price: 4000,
    size: 4000,
    available: true
  }
}

function filter(obj, comparator){
  var list = [];
  for(var k in obj){
    if(obj.hasOwnProperty(k)){ // fix for IE
      if(comparator(obj[k], k, obj)) list.push(obj[k]);
    }
  }
  return list;
}

function isExample(obj, key){
  if(/^example/.test( key.toLowerCase() )) return true;
}

function isAvailable(obj){
  if(obj.available) return true;
}

/**
 * And here's how you use it
 */

var examples  = filter(objects, isExample);
var available = filter(objects, isAvailable);

var availableExample = filter(examples, isAvailable);

filter 函数返回一个包含所有匹配对象的数组。

- - 编辑 - -

您希望它说出控制台中对象的名称。我假设您的意思是控制台当前显示 [object, object, object, object]。有两种方法可以做到这一点:

(1) 把名字放在对象本身

example1:
{
  name: "example1",
  price: 1000,
  size: 1000,
  available: true
}

(2)在过滤操作中捕获名称

var names = [];
var examples  = filter(objects, function(obj, name){
  if(/^example/.test( name.toLowerCase() )){
    names.push(name);
    return true;
  }
});

console.log(names);
于 2013-01-23T06:06:26.623 回答
0

如果所有变量都在全局范围内,我喜欢下面

  var passedElements = [];
  for(var i = 1, l = 100 /* Maximum number of variable */ ; i < l; i++){
       if(window['example' + i]){
          var temp = window['example' + i];
          if(temp.available === true){
             passedElements.push(temp);
          }
       }/*
       else{
          // Dont break the loop here, if any variable is missing in between 
             two variables it will fail. Eg : Example1, Example3.. 2 is missing.
       }*/
  }
  console.log(passedElements);

我希望它会有所帮助。

于 2013-01-23T05:34:53.440 回答
0

似乎以下行是由一些逻辑代码生成的: var example1= {price:1000, size: 1000, available:true}

为什么不简单地将可变名称存储在另一个应该为您提供 Q-1 解决方案的数组中。

然后您可以轻松遍历所有变量(数组)以找到具有“真”作为“可用”值的变量

于 2013-01-23T05:42:32.047 回答