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

标签 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。我正在遍历表中的一组或几行,只想返回符合特定条件的那些。

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

最佳答案

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

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;

关于Javascript - 基于多个属性返回对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23349830/

相关文章:

C++ 将值移至数组开头

javascript - 动态表并保持 thead 固定

javascript - 使用 JS 或 JQUERY 选择页面加载时的第一个 html 表行

c++ - 基本迭代器 C++ 如何迭代 vector 数组

java - 将数组转换为列表

c - 取消排序数组并保留 C 中数组元素的原始顺序

javascript - Ember 扩展和属性

java - Jquery ajax 调用没有命中 servlet

arrays - VB.NET 检查现有文件并为该名称分配新的版本号?

algorithm - 计算 AVL 树算法的时间复杂度