#javascript #jquery #clone #ecmascript-5
#javascript #jquery #клонировать #ecmascript-5
Вопрос:
Есть ли способ вычесть определенное свойство, чтобы сделать его клонируемым (поскольку свойство может содержать круги)?
Может быть, что-то похожее на это:
item = { a: 'A', b: 'B', circularProperty: somethingCircular };
$.extend(true,{},item.withoutProperties(['circularProperty']);
Ответ №1:
Вы можете сделать так
item = { a: 'A', b: 'B', circularProperty: 'abc' };
function removeProperty(obj, propertyName) {
let { [propertyName]: _, ...result } = obj
return result
}
console.log(removeProperty(item, 'circularProperty'));
Ответ №2:
использование delete
и временная переменная
const item = {
a: 'A',
b: 'B',
circularProperty: {
a: 'A',
b: 'B',
circularProperty: {
a: 'A',
b: 'B'
}
}
};
let temp = item.circularProperty;
delete item.circularProperty;
console.log(item);
item.circularProperty = temp;
console.log(item);
Ответ №3:
Я знаю, что у Lodash есть pick
метод, если я не ошибаюсь, но я не верю jQuery
, что для этого есть встроенные операции. Вероятно, вам придется реконструировать объект.
var objectKeys = Object.keys(item);
var keysWithoutCircularProperty = objectKeys.filter(function(key){
return key != 'circularProperty';
});
var shallowClone = keysWithoutCircularProperty.reduce(function(result, key) {
result[key] = item[key];
return resu<
}, {});
Удалены функции со стрелками, так как вы сказали, что нет ES6 в другом ответе.
Комментарии:
1. Читаемость всегда можно улучшить в соответствии с вашими вкусами.
2. а как насчет глубокого клонирования ?
3. Возможно, глубокое клонирование будет связано с этим
$.extend()
вызовом. Это просто удаление ключа. Хотя лично я бы просто упорядочил его, а затем снова проанализировал.
Ответ №4:
Вы можете использовать назначение деструктурирования ES6.
const { circularProperty, ...rest } = item;
$.extend(true, {}, rest);
Комментарии:
1. к сожалению, ES6 недоступен
2. К сожалению, jquery.extend не будет работать таким образом: «глубокое расширение циклической структуры данных приведет к ошибке».