为什么这不会返回一个数组,该数组包含位于给定键

时间:2016-10-30 22:55:33

标签: javascript object element pop

问题在于:

给定一个对象和一个键,编写一个函数,该函数返回一个数组,该数组包含位于给定键的数组的最后一个元素。

注意:

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

我的代码:

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测试都失败,包括包含“应该返回一个包含除了位于键的数组的最后一个元素之外的所有元素的数组”?

4 个答案:

答案 0 :(得分:0)

无论您为key中的key参数输入什么,每次运行时,您的函数都会查找function getAllButLastElementOfProperty(obj, 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;
}

答案 1 :(得分:0)

这是你可以做的,验证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'));




答案 2 :(得分:0)

使用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 :(得分:0)

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;

我遇到了同样的问题......这个问题运行正常,但由于某些原因,我得到了相同的失败测试:&#34; TypeError:无法读取属性&#39;长度&#39;未定义&#34;对于所有的测试。我会尝试最新的解决方案,但有些人可以告诉我为什么会抛出这个错误吗?感谢