根据位置

时间:2016-09-16 03:06:27

标签: javascript object associative-array

给定对象属性的位置,以数组的形式([a, b, c]对应object.a.b.c),如何执行语句delete object.a.b.c的等价物?

编辑:澄清一下,我想写一个看起来像这样的函数:

function deleteProperty(object, location) {
    // do stuff
}

并具有以下效果:

var obj = {"foo": "FOO", "bar": "BAR", "a": {"b": "B"}};
deleteProperty(obj, [a, b]);
typeof obj.a.b === "undefined";

3 个答案:

答案 0 :(得分:3)

在本声明中

deleteProperty(obj, [a, b]);

ab是变量名,这是不正确的语法。

如果传递字符串名称,则可以实现此功能:

deleteProperty(obj, ["a", "b"]);

看起来像这样:



function deleteProperty(obj, location) 
{
  var finalPropertyName = location.pop();

  location.forEach(function(key) { obj = obj[key]; });

  delete obj[finalPropertyName];
}

var obj = { foo: 'FOO', bar: 'BAR', a: { b: 'B' } };
deleteProperty(obj, ["a", "b"]);
console.log(obj);

var obj2 = { foo: 'FOO', bar: 'BAR', a: { b: 'B' } };
deleteProperty(obj2, ["a"]);
console.log(obj2);




当然,这个片段只是一个想法。您可以更好地实现它,或添加任何功能,例如检查现有属性。

答案 1 :(得分:2)

你需要使用括号表示法并循环,直到你到达最后一个,然后使用最后一个进行删除。

function deleteProperty(obj, loc) {
  var last = loc.pop(); //grab last item from array
  var x = loc.reduce(function(o, x) {  //walk obj until all properties are there
    return o[x];
  }, obj);
  delete x[last];  //delete the last item from the array
}


var obj = {
  "foo": "FOO",
  "bar": "BAR",
  "a": {
    "b": "B"
  }
};
deleteProperty(obj, ["a", "b"]);
console.log(obj.a.b);

代码假定路径在那里,没有检查null / undefined / invalid path。

答案 2 :(得分:1)

如果您要使用图书馆,请尝试lodash's _.unset。这个例子直接来自文档:

  

删除对象路径的属性。

     

注意:此方法会改变对象。

var object = { 'a': [{ 'b': { 'c': 7 } }] };
_.unset(object, 'a[0].b.c');
// => true

console.log(object);
// => { 'a': [{ 'b': {} }] };

_.unset(object, ['a', '0', 'b', 'c']);
// => true

console.log(object);
// => { 'a': [{ 'b': {} }] };

在您的情况下,您可以:

var obj = { foo: 'FOO', bar: 'BAR', a: { b: 'B' } };
_.unset(obj, ['a', 'b']);
typeof obj.a.b === 'undefined'; // => true

如果您想要使用自己的代码模仿它,可以查看它们是如何实现的on line 4155 of the source

/**
 * The base implementation of `_.unset`.
 *
 * @private
 * @param {Object} object The object to modify.
 * @param {Array|string} path The path of the property to unset.
 * @returns {boolean} Returns `true` if the property is deleted, else `false`.
 */
function baseUnset(object, path) {
  path = isKey(path, object) ? [path] : castPath(path);
  object = parent(object, path);

  var key = toKey(last(path));
  return !(object != null && hasOwnProperty.call(object, key)) || delete object[key];
}

但是,您必须查找其中使用的每个功能。