Клонировать объект только с несколькими свойствами

Есть ли способ клонировать объект только с несколькими свойствами объекта в JS? Например..

var Person = {
    name: "Bob",
    age: 32,
    salary: 20000
};

Мне нужно создать другой объект человека только с именем и свойством возраста, чтобы он выглядел примерно так:

var clonedPerson = {
    name: "Bob",
    age: 32
};

Я мог бы сделать глубокое клонирование объекта и удалить. Но я хотел знать, есть ли лучшие способы сделать это.


person codeMan    schedule 27.09.2016    source источник
comment
Вы можете просто просмотреть свойства старого объекта и скопировать только те, которые вам нужны.   -  person VLAZ    schedule 27.09.2016
comment
Если вы не хотите использовать удаление, вы должны определить новый объект только с теми свойствами, которые вам нужны. Нет собственного метода для копирования объекта только с нужными свойствами.   -  person Danmoreng    schedule 27.09.2016
comment
@adeneo работает только для строк, если вы сделаете это со свойством, внутри которого есть объект, оно будет ссылаться, а не клонировать   -  person Danmoreng    schedule 27.09.2016
comment
@user2415266 user2415266 - в примере ОП я вижу только примитивы   -  person adeneo    schedule 27.09.2016
comment
@adeneo, вы не должны предполагать, что это только примитивы ... и он говорит о глубоком клонировании, что для меня означает, что это был просто пример, а не фактические данные.   -  person Danmoreng    schedule 27.09.2016
comment
@user2415266 user2415266 - к сожалению, у меня нет ни времени, ни места, чтобы написать целую итеративную функцию, которая выполняет глубокие клоны на основе имен ключей, в поле для комментариев, но не стесняйтесь отвечать на вопрос.   -  person adeneo    schedule 27.09.2016
comment
@adeneo, вы не должны писать любой ответ в комментариях - полнофункциональный или нет!   -  person Jamiec    schedule 27.09.2016
comment
@Jamiec - указывать ОП в правильном направлении с помощью комментария, когда никто не может удосужиться написать полноценный ответ, объясняющий проблему, - это нормально.   -  person adeneo    schedule 27.09.2016


Ответы (3)


Используя последнюю версию ES6, вы можете добиться этого с помощью следующего кода.

const Person = {
  name: "Bob",
  age: 32,
  salary: 20000
};
const { salary , ...clonedPerson } = Person

console.log(clonedPerson)

person Pranesh Ravi    schedule 27.09.2016
comment
Это выглядит как элегантное решение. К сожалению, я не использую ES6. - person codeMan; 28.09.2016

Более простой?

var Person = {
    name: "Bob",
    age: 32,
    salary: 20000
};
var ClonedPerson = jQuery.extend({}, Person);
delete ClonedPerson.salary;

console.log(JSON.stringify(Person));
console.log(JSON.stringify(ClonedPerson));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

person Marcos Alexandre Sedrez    schedule 27.09.2016
comment
ОП сказал: Я могу сделать глубокое клонирование объекта и удалить его. Но я хотел знать, есть ли более эффективные способы сделать это. Тем не менее, вы используете delete ? - person Pranesh Ravi; 27.09.2016
comment
Я думал очень просто таким образом, просто хотел подтвердить. И по иронии судьбы вы выставили лучший способ... :) - person Marcos Alexandre Sedrez; 27.09.2016
comment
@MarcosSedrez Спасибо .. Но да .. как упомянул Пранеш .. Я хотел знать, есть ли какой-либо альтернативный способ сделать это. - person codeMan; 28.09.2016

альтернативный подход с использованием методов-членов массива:

var clone = Object.keys(Person) // convert to an Array of Person keys
            .filter(function(key){return ["salary"].indexOf(key) == -1;}) // exclude key salary
            .reduce(function(clone, current){clone[current] = Person[current]; return clone;}, {}); // convert back the array to a cloned literal object
person OBDM    schedule 27.09.2016