2016-09-16 3 views
0

Учитывая расположение объекта объекта в виде массива ([a, b, c], соответствующего object.a.b.c), как я могу выполнить эквивалент оператора delete object.a.b.c?Удалить свойство объекта с учетом его местоположения

EDIT: уточнить, я хочу, чтобы написать функцию, которая выглядит следующим образом:

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

и имеет следующий эффект:

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

ответ

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);

код предполагает, что путь будет там, нет проверки на нуль/неопределенному/недопустимый путь.

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]; 
} 

Вам нужно будет искать все функции, используемые внутри там.

3

В этом заявлении

deleteProperty(obj, [a, b]); 

a и b являются имена переменных, что является неправильным синтаксисом.

можно реализовать эту функцию, если вы передаете строковые имена:

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);

Конечно, этот фрагмент просто идея. Вы можете реализовать его лучше или добавить любую функциональность, например, проверку существующих свойств.

 Смежные вопросы

  • Нет связанных вопросов^_^