【问题标题】:I'm getting wrong output in Javascript Function?我在 Javascript 函数中得到错误的输出?
【发布时间】:2021-08-30 02:15:28
【问题描述】:

我有一个函数,它查看对象数组(第一个参数)并返回一个包含匹配名称和值对的所有对象的数组(第二个参数)。如果要包含在返回的数组中,源对象的每个名称和值对都必须存在于集合中的对象中。

function whatIsInAName(collection, source) {
  let keyArr = Object.keys(source);
  for (let i = 0; i < keyArr.length; i++) {
    var arr = collection.filter(function(item) {
      return item.hasOwnProperty(keyArr[i])
    })
  }

  return arr.filter(function(item) {
    for (let g = 0; g < keyArr.length; g++) {
      return item[keyArr[g]] === source[keyArr[g]];
    }
  });

}
console.log(whatIsInAName([{
  "a": 1,
  "b": 2,
  "c": 3
}], {
  "a": 1,
  "b": 9999,
  "c": 3
}));

我应该给一个空数组[ ]
但它给了[{"a": 1, "b": 2, "c": 3}]

【问题讨论】:

    标签: javascript arrays algorithm function object


    【解决方案1】:

    您的第二个过滤器出现错误。
    for 语句中,您从该语句返回第一项的比较结果,而不是检查整个 arr 是否相等。

    在下面的代码中,我已将 for 语句更改为在项目不匹配时返回 false。然后最后返回true,因为没有找到任何与其他arr不匹配的项目。

    function whatIsInAName(collection, source) {
        let keyArr = Object.keys(source);
        
        for(let i = 0; i < keyArr.length; i++){
            var arr = collection.filter(item => item.hasOwnProperty(keyArr[i]));
        }
    
        return arr.filter(item => {
            for(let g = 0; g < keyArr.length; g++) {
                if (item[keyArr[g]] !== source[keyArr[g]]) {
                    return false;
                }
            }
            return true;
        });
    }
    console.log(
        whatIsInAName(
            [{"a": 1, "b": 2, "c": 3}, {"a": 1, "b": 9999, "c": 3}],
            {"a": 1, "b": 9999, "c": 3}
        )
    );

    【讨论】:

      【解决方案2】:

      第一个循环是做什么用的?在那里创建的arr 在循环的每次迭代中都会被覆盖。所以最终的arr 将是至少包含Object.keys() 中最后一个属性的项目数组。您可以直接在collections 参数上应用您的过滤器。

      function whatIsInAName(collection, source) {
        let keys = Object.keys(source);
        return collection.filter(item => keys.every(k => item[k] === source[k]));
      }
      
      console.log(whatIsInAName([
          {"a": 1, "b": 9999, "c": 3 }, 
          {"a": 2, "b": 9999, "c": 3 }, 
          {"a": 1, "b": 2, "c": 3 }, 
          {"a": 1, "b": 9999, "c": 3, "d": 4 }
         ], 
         {"a": 1, "b": 9999, "c": 3}));

      请记住,相等检查 === 仅适用于原始值,但不适用于对象或数组。此外,此方法将接受集合项目中不存在于源项目中的其他属性。

      【讨论】:

        猜你喜欢
        • 2021-11-18
        • 1970-01-01
        • 2012-09-27
        • 1970-01-01
        • 1970-01-01
        • 2012-04-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多