Javascript-基于多个属性返回对象

Javascript-基于多个属性返回对象,javascript,arrays,algorithm,object,filtering,Javascript,Arrays,Algorithm,Object,Filtering,我需要创建一个函数,它接受对象的数组并返回符合特定条件集的对象。到目前为止,我得到的是相当简单的:(伪代码) 其中,条件是表示匹配对象必须拥有的一个或多个属性的对象 问题是,这会以某种方式返回重复的对象,这显然是不可能发生的。我知道有一个标准的方法来实现这一点(可能是编程101之类的东西),但我的GoogleFoo让我失望了 注意:由于上下文关系,我不能在此处使用Array.prototype.filter。我正在遍历表中的一个或多个行,只想返回符合某些条件的行 基本上,这个想法是“返回与输入对

我需要创建一个函数,它接受
对象的数组
并返回符合特定条件集的对象。到目前为止,我得到的是相当简单的:(伪代码)

其中,
条件
是表示匹配对象必须拥有的一个或多个属性的对象

问题是,这会以某种方式返回重复的对象,这显然是不可能发生的。我知道有一个标准的方法来实现这一点(可能是编程101之类的东西),但我的GoogleFoo让我失望了

注意:由于上下文关系,我不能在此处使用
Array.prototype.filter
。我正在遍历表中的一个或多个行,只想返回符合某些条件的行

基本上,这个想法是“返回与输入对象相似的对象。

使用:


是否要实现该功能?

您离解决方案非常近。
如果多个属性匹配,您将为每个匹配添加“行”。
只要在循环条件循环结束后,每行添加一次即可。
这是一个花括号位置的问题:

var results = [];
for (var i =0; i<source.length; i++) {
    var row = source[i];
    var match = true;  
    var samePropCount = 0;
    for (var prop in row) {
        for (var cond in conditions) {
            if (cond === prop ) {
                samePropCount++;
                if (conditions[cond] != row[prop]) {
                   match = false;
                }
            }
        }  
    } 
    if (!samePropCount) match=false;
    if (match) {
        results.push(row);
    }
}
return results;
var结果=[];

对于(var i=0;i您确定生成的重复对象是由于此脚本而不是源表中生成行的查询造成的吗?@DevlshOne:没有涉及任何查询。所讨论的表是一个用标记手动构造的
。尽管我实际上是在做一个查询。您能提供有关crit的更多详细信息吗eria和一个表行示例?@DevlshOne:检查我的更新。基本上,是的。但我需要它能够接收表示要满足哪些条件的对象。您可以将对象数组传递给筛选器此逻辑有缺陷。假设您的对象是
{a:1,b:2,c:3}
,条件是
{a:1,c:4}
。一旦在
{a:1}
中找到匹配项,匹配项将设置为true。该项将被错误地添加到结果中,因为所提供的伪代码中的
c
没有匹配项,看起来所有属性都必须匹配。当条件为
{prop1:“x”,prop2:“z”}
@BrianGlaz你说得对,我读得不够仔细。现在它可能很好。@gamealchest:效果很好!我知道我遗漏了什么。
var evens = _.filter([1, 2, 3, 4, 5, 6], function(num){ return num % 2 == 0; });
=> [2, 4, 6]
var results = [];
for (var i =0; i<source.length; i++) {
    var row = source[i];
    var match = true;  
    var samePropCount = 0;
    for (var prop in row) {
        for (var cond in conditions) {
            if (cond === prop ) {
                samePropCount++;
                if (conditions[cond] != row[prop]) {
                   match = false;
                }
            }
        }  
    } 
    if (!samePropCount) match=false;
    if (match) {
        results.push(row);
    }
}
return results;