【问题标题】:Return Element Array from an object key从对象键返回元素数组
【发布时间】:2017-10-28 06:14:36
【问题描述】:

给定一个对象和一个键,我创建了一个函数,该函数返回一个数组,该数组包含位于给定键处等于 10 的数组的所有元素。

如果数组为空,它应该返回一个空数组,如果数组不包含等于 10 的元素,它应该返回一个空数组,如果给定键的属性不是数组,它应该返回一个空数组数组。

function getElementsThatEqual10AtProperty(obj, key) {
  for(var prop in obj){
    if(obj[prop] === 10){
      return obj[key];
    }
  }
}

var obj = {
  key: [1000, 10, 50, 10]
};

var output = getElementsThatEqual10AtProperty(obj, 'key');
console.log(output); // --> IT MUST RETURN [10, 10]

知道我做错了什么吗?

【问题讨论】:

标签: javascript arrays


【解决方案1】:

obj['key'] 是一个数组...所以它永远不会等于10。您还需要过滤该数组。

可以为此使用Array#filter()

function getElementsThatEqual10AtProperty(obj, key) {
   var arr = obj[key] || [];
    return arr.filter(function(val){
        return val === 10;
    });
}

var obj = {
  key: [1000, 10, 50, 10]
};

var output = getElementsThatEqual10AtProperty(obj, 'key');
console.log(output); // --> IT MUST RETURN [10, 10]

【讨论】:

    【解决方案2】:

    在您的代码中,您正在迭代对象中的所有属性。

    for(var prop in obj)
    

    所以 prop 将在第一次迭代中出现在您的“关键”中。然后你问obj['key'] === 10

    这不是您要进行的检查,因为这基本上是[1000, 10, 50, 10] === 10

    然后您可以Filter 数组,查找所有符合您条件的项目,即是否等于 10?

    return obj['key'].filter(function(item) {
        return item === 10;
    });
    

    您可以走得更远,因为您知道要查找的密钥,将其传递给您的函数,因此您不必迭代您的对象,您可以直接找到它:

    obj[key]
    

    但是,正如你所说,如果它不匹配,你想返回一个空数组,所以你可以使用:

    var array = (obj[key] || [])
    

    这基本上意味着,如果 obj[key] 不存在,那么只需使用[]

    结合整个事情看起来像:

    function foobar(object, key) {  
      return (object[key] || []).filter(function(item) {
        return item === 10;
      });
    }
    
    var object = {
      unique: [1, 10, 100, 10],
      nothing: [1,2,3,4,5]
    }
    
    console.log(foobar(object, 'unique'));  // returns [10, 10]
    console.log(foobar(object, 'asgasgag')); // returns [] 
    console.log(foobar(object, 'nothing')); // returns []

    【讨论】:

      【解决方案3】:

      如果我理解正确,您想检查obj 的属性key 是否为数组,如果是,则返回所有等于10 的元素。

      由于您已经有了属性的名称,因此无需迭代。只需直接访问key 属性,并检查它是否为Array 类型。然后,您需要过滤数组。

      这是一个代码示例(不是最好的,但用于学习目的):

      function getElementsThatEqual10AtProperty(obj, key) {
        if(obj[key] instanceof Array){ 
           // the key property is an array
           return obj[key].filter(function(v){ return v == 10;})
        }  
        // not an array
        return [];
      }
      

      【讨论】:

        【解决方案4】:

        也许这样的事情会帮助你朝着正确的方向前进?

        function getElementsThatEqual10AtProperty(obj) {
          var response = [];
          for (var i = 0; i < obj.key.length; i++) {
             if (obj.key[i] === 10) {
               response.push(obj.key[i]);
             }
          }
          return response;
        }
        
        var obj = {
          key: [1000, 10, 50, 10]
        };
        
        var output = getElementsThatEqual10AtProperty(obj);
        console.log(output);

        【讨论】:

          【解决方案5】:

          有更短的方法。可以使用 .map 和 .filter 请参见下文。

          var obj = {
             key: [1000, 10, 50, 10]
          };
          
          //To get the key
          var output = obj.key.map((obj,i) => obj === 10 ? obj : '').filter(String);
          
          //To get the index
          var index = obj.key.map((obj,i) => obj === 10 ? i : '').filter(String);
          
          
          //log output || index
          console.log(output);
          

          【讨论】:

            【解决方案6】:

            对于您的情况,您可以使用 Array 的方法 reduce。在你的函数内部:

             return obj[key].reduce(function (result, value) {
                  if (value === 10) result.push(value)
             }, []);
            

            MSDN 参考: .reduce()

            【讨论】:

              【解决方案7】:

              这可以通过使用filter来实现。

              filter() 方法创建一个新数组,其中包含通过所提供函数实现的测试的所有元素。

              我在下面的解决方案中使用了ES6 箭头语法以更简洁。您也可以直接在数组上调用 .filter() 并显式提供谓词(项 === 10),而不是为此创建函数以动态提供。

              const myArr = [10,100,10,1];
              
              const filterBy = (arr, key) => arr.filter(item => item === key);
              
              filterBy(myArr, 10); // returns [10, 10]
              

              注意:如果不满足提供给过滤器的谓词(在这种情况下,没有找到值 10),将返回一个空数组。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2023-01-26
                • 1970-01-01
                • 1970-01-01
                • 2013-02-19
                • 1970-01-01
                • 2017-11-16
                • 2019-07-14
                • 1970-01-01
                相关资源
                最近更新 更多