Модифицируйте объект JS в чистом виде - PullRequest
0 голосов
/ 14 ноября 2018

У меня есть функция, которая преобразует объект JS.Он извлекает новое свойство из существующего, а затем удаляет исходное свойство.По сути как то так:

/** Derives "capName" property from "name" property, then deletes "name" */
function transform(person) {
  person["capName"] = person["name"].toUpperCase();
  delete person["name"];
  return person;
}

var myPerson = {
  name: "Joe",
  age: 20
};

var newPerson = transform(myPerson);

console.log(myPerson, newPerson);

Функция возвращает нужный объект newPerson, но также изменяет исходный объект myPerson.Я бы предпочел сделать это в чистом виде, который не изменяет исходный объект myPerson.

Примечание : мне действительно нужно быть совместимым с ES5, но я бы хотелсм. также решение ES6.

Ответы [ 4 ]

0 голосов
/ 14 ноября 2018

Вы можете создать новый объект без нежелательного и нового свойства.

function transform(person) {
    return Object
        .keys(person)
        .reduce(function (r, k) {
            if (k === 'name') {
                r.capName = person.name.toUpperCase();
            } else {
                r[k] = person[k];
            }
            return r;
        }, {});
}

var myPerson = { name: "Joe", age: 20 },
    newPerson = transform(myPerson);

console.log(myPerson);
console.log(newPerson);
0 голосов
/ 14 ноября 2018

Довольно легко с деструктуризацией:

 const transform = ({ name, ...rest }) => ({ capName: name.toUpperCase(), ...rest });

Мне действительно нужно быть совместимым с ES5

Использование BabelJS , это делает вашу жизнь такоймного eaiser.

0 голосов
/ 14 ноября 2018

Для совместимости с ES5 вы можете использовать JSON.parse(JSON.stringify(person)). Помните, что методы, прикрепленные к person, теряются в пути, потому что они не могут быть JSON.stringify ed.

.

/** Derives "capName" property from "name" property, then deletes "name" */
function transform(person) {
  var obj = JSON.parse(JSON.stringify(person));
  obj["capName"] = obj["name"].toUpperCase();
  delete obj["name"];
  return obj;
}

var myPerson = {
  name: "Joe",
  age: 20
};

var newPerson = transform(myPerson);

console.log(myPerson, newPerson);

Если вы хотите сохранить методы, просто переберите ключи объекта:

/** Derives "capName" property from "name" property, then deletes "name" */
function transform(person) {
  var obj = {};
  for (var key in person) {
    obj[key] = person[key];
  }
  obj["capName"] = obj["name"].toUpperCase();
  delete obj["name"];
  return obj;
}

var myPerson = {
  name: "Joe",
  age: 20
};

var newPerson = transform(myPerson);

console.log(myPerson, newPerson);

Имейте в виду, что ни один из представленных методов не делает глубокий клон. Для этого я бы порекомендовал вам использовать что-то вроде lodash _.clone(obj, { deep: true });

0 голосов
/ 14 ноября 2018

просто используйте Object.assign, который создаст новый объект с новой ссылкой

function transform(person) {
  var obj = Object.assign({}, person);
  obj["capName"] = obj["name"].toUpperCase();
  delete obj["name"];
  return obj;
}
        
var myPerson = {
  name: "Joe",
  age: 20
};

var newPerson = transform(myPerson);

console.log('newPerson:', newPerson);
console.log('myPerson:', myPerson);
...