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

时间:2014-04-28 19:43:45

标签: javascript arrays algorithm object filtering

我需要创建一个接收Object数组的函数,并返回符合特定条件集的对象。到目前为止我所拥有的很简单:(伪代码)

// input:  conditions: { prop1: "x", prop2: "z"}
//         source: [{ prop1: "x", prop2: "y"}, { prop1: "x", prop2: "z"}];
// output: array of objects with the same properties & values
// ex:
// getObjects({ prop1: "x", prop2: "z"}, [{ prop1: "x", prop2: "y"}, { prop1: "x", prop2: "z"}]);
// returns: [{ prop1: "x", prop2: "z"}]

//....
var results = [];
for (var prop in obj) {
    var match = false;
    for (var cond in conditions) {
        if (cond === prop && conditions[cond] == obj[prop]) {
            match = true;
        }
    }
    if (match) {
        results.push(row);
    }
}
return results;

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

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

注意:由于上下文,我在这里不能使用Array.prototype.filter。我正在运行表中的一组或多行,只想返回符合特定条件的那些。

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

2 个答案:

答案 0 :(得分:2)

你离解决方案很近。
如果多个属性匹配,您将为每个匹配添加“行” 只需在每一行添加一次,在条件循环后,在道具结束后循环 这是大括号位置的问题:

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;

答案 1 :(得分:0)

使用underscore

var evens = _.filter([1, 2, 3, 4, 5, 6], function(num){ return num % 2 == 0; });
=> [2, 4, 6]

你想实现这个功能吗?