【问题标题】:Javascript - returning objects based on multiple propertiesJavascript - 基于多个属性返回对象
【发布时间】:2014-06-14 12:22:21
【问题描述】:

我需要创建一个函数,该函数接受Objects 数组并返回与一组特定条件匹配的对象。到目前为止我所拥有的相当简单:(伪代码)

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

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

【问题讨论】:

  • 您确定生成的重复对象是由该脚本引起的,而不是由从源表中生成行的查询引起的吗?
  • @DevlshOne:不涉及查询。有问题的表是在标记中手动构建的<table>。虽然我实际上在做的是一个查询。
  • 您能否提供有关标准和表格行示例的更多详细信息?
  • @DevlshOne:检查我的更新。

标签: javascript arrays algorithm object filtering


【解决方案1】:

underscore:

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

你要实现这个功能吗?

【讨论】:

  • 基本上,是的。但我需要它能够接收表示要满足哪些条件的对象。
  • 您可以将对象数组传递给过滤器
【解决方案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;

【讨论】:

  • 这个逻辑是有缺陷的。假设您的对象是{a:1, b:2, c:3},条件是{a:1, c:4}。一旦在{a:1} 中找到匹配项,match 将设置为 true。由于c没有匹配项,该项目将错误地添加到结果中
  • 从提供的伪代码看来,所有属性都必须匹配。当条件为{ prop1: "x", prop2: "z"}时,对象{ prop1: "x", prop2: "y"}不在结果中
  • @BrianGlaz 你是对的,我没有仔细阅读。现在可能会很好。
  • @GameAlchemist:这很好用!我知道我错过了什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多