Получение объекта без определенного свойства

#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 не будет работать таким образом: «глубокое расширение циклической структуры данных приведет к ошибке».