【问题标题】:Why does this not return an array containing all but the last element of of an array located at a given key为什么这不返回一个数组,该数组包含位于给定键的数组的最后一个元素之外的所有元素
【发布时间】:2017-03-13 02:02:52
【问题描述】:

问题来了:

给定一个对象和一个键,编写一个函数,该函数返回一个数组,该数组包含位于给定键处的数组中除最后一个元素之外的所有元素。

注意事项:

  • 如果数组为空,它应该返回一个空数组。
  • 如果给定键的属性不是数组,则返回一个空数组。
  • 如果键没有属性,它应该返回一个空数组。

我的代码:

var obj = {
key: [1, 2, 3]
};

function getAllButLastElementOfProperty(obj, key) {
var arr = []
arr = obj.key.pop()
return obj.key
}

getAllButLastElementOfProperty(obj, 'key') // [1, 2]

问题:

为什么每次 repl 测试都会失败,包括“应该返回一个数组,该数组包含位于 key 的数组的最后一个元素除外”??

【问题讨论】:

    标签: javascript arrays object element


    【解决方案1】:
    var obj = {
       key: [1, 2, 3]
    };
    
    function getAllButLastElementOfProperty(obj, key) {
        if(obj.key.length < 1 || !Array.isArray(obj.key) || !obj.hasOwnProperty(key)) { 
            return []; 
        }
        var newObj = obj.key.slice(0, obj.key.length - 1);
        return newObj;
    }
    
    var output = getAllButLastElementOfProperty(obj, 'key');
    output;
    

    我遇到了同样的问题...这运行正常,但由于某种原因,我得到了相同的失败测试:“TypeError: Cannot read property 'length' of undefined”对于所有测试。我将尝试最新的解决方案,但有人能告诉我为什么会抛出该错误吗?谢谢

    【讨论】:

    • 我建议创建新问题。
    【解决方案2】:

    有一个pop() 的用法。此方法删除 已用 数组的最后一个值。每次运行此方法时,它都会将数组缩短一。因此使用 Array.prototype.slice()。它不会改变数组。

    如果项目是数组,则使用Array.isArray() 进行测试:

    if(!Array.isArray(item)) { return []; }
    

    总计

    var obj = {
      key: [1, 2, 3]
    };
    
    function getAllButLastElementOfProperty(obj, key) {
      if (!Array.isArray(obj.key)) {
        return [];
      }
      var res = [],
        arr = obj.key;
      res = arr.slice(0, (arr.length - 1)); // slice() doesn't change the used array
      return res;
    }
    
    console.log(getAllButLastElementOfProperty(obj, "key"));
    console.log(getAllButLastElementOfProperty(obj, "key"));
    console.log(getAllButLastElementOfProperty(obj, "key"));
    console.log(getAllButLastElementOfProperty(obj, "key"));

    【讨论】:

      【解决方案3】:

      无论您在function getAllButLastElementOfProperty(obj, key) 中为key 参数输入什么内容,每次运行您的函数都会查找key 属性。

      尝试像这样修改它:

      var test_obj = {
          key: [1, 2, 3],
          banana: [3,2,1],
      };
      
      function getAllButLastElementOfProperty(obj, key) {
          var new_obj = obj;
          new_obj[key].pop()
          return new_obj[key];
      }
      
      console.log(getAllButLastElementOfProperty(test_obj, 'banana')) // [1, 2]
      

      这将利用函数中的key 参数作为obj 的属性。

      编辑:我实际上会使用以下函数,这样它就不会修改原始对象 (test_obj):

      function getAllButLastElementOfProperty(obj, key) {
          var arr = obj[key].slice(0); // Duplicate array without modifying original in test_obj
          arr.pop();  // remove last element
          return arr;
      }
      

      【讨论】:

      • OP 也返回obj.key
      【解决方案4】:

      这是您可以做的,验证 key 的值是否为 Array,然后继续从数组中删除最后一个元素。希望这会有所帮助。

      var obj = {
        key: [1, 2, 3],
        newKey: [4, 5],
        singleValue: [1],
        emptyArray: [],
        objectKey: {}
      };
      
      function getAllButLastElementOfProperty(obj, key) {
        var arr = [],
          objectAtKey = obj[key];
        if (Array.isArray(objectAtKey)) {
          arr = objectAtKey.slice(0, objectAtKey.length - 1);
        }
        return arr;
      }
      
      console.log(getAllButLastElementOfProperty(obj, 'key'));
      console.log(getAllButLastElementOfProperty(obj, 'newKey'));
      console.log(getAllButLastElementOfProperty(obj, 'singleValue'));
      console.log(getAllButLastElementOfProperty(obj, 'emptyArray'));
      console.log(getAllButLastElementOfProperty(obj, 'objectArr'));
      console.log(getAllButLastElementOfProperty(obj, 'nonExistentKey'));

      【讨论】:

      • 谢谢。这是唯一通过所有测试的。顶部返回除最后一个之外的所有元素,但未通过 repl 测试,它返回一个包含除最后一个之外的所有元素的数组
      • 我放在这里的解决方案是否适用于您的所有案例?我不明白“第一个返回除最后一个之外的所有元素,但没有通过 repl 测试,它返回一个包含除最后一个元素之外的所有元素的数组”我的代码 sn-p 中是否有一些不起作用/丢失的东西。
      • 它向我返回了正确的值,但是当我在 repl 中按下提交时,它说它不会“返回除最后一个元素之外的所有元素的数组。它很好地满足了注释。看看我的新问题。它返回我需要的每个值并满足所有注释,但说它没有通过任何一个。我很困惑
      猜你喜欢
      • 1970-01-01
      • 2019-11-06
      • 2011-07-06
      • 1970-01-01
      • 2021-09-20
      • 1970-01-01
      • 2014-12-03
      • 1970-01-01
      • 2019-09-19
      相关资源
      最近更新 更多