我需要创建一个接收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
。我正在运行表中的一组或多行,只想返回符合特定条件的那些。
基本上,这个想法是“返回类似于输入对象的对象。
答案 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]
你想实现这个功能吗?