Есть ли функция для назначения свойств только в месте назначения, если свойство существует? - PullRequest
2 голосов
/ 03 апреля 2019

Это может быть несбыточной мечтой, но мне бы понравилась функция JavaScript (или lodash?), Которая делает это:

let obj1 = {
  prop1: 'first thing',
  prop2: 'second thing'
};
let obj2 = {
  prop2: 'overridden second thing',
  prop3: 'and another thing'
};

let result = magicalFunction(obj1, obj2);

// result is { prop1: 'first thing', prop2: 'overridden second thing' }

Другими словами, мне нужна версия Object.assign, который позволяет мне указать, что я хочу, чтобы свойства одного объекта были "прецедентом", и что все свойства исходных объектов, которые не встречаются в прецеденте, должны игнорироваться.

Ответы [ 3 ]

2 голосов
/ 03 апреля 2019

Да, вы можете сделать это - перебрать Object.keys исходного объекта и проверить, есть ли свойство с тем же именем в объекте заменителя - заменить, если есть, и не делать, если его нет:

let obj1 = {
  prop1: 'first thing',
  prop2: 'second thing'
};
let obj2 = {
  prop2: 'overridden second thing',
  prop3: 'and another thing'
};

let result = magicalFunction(obj1, obj2);

function magicalFunction(source, replacer) {
  let output = {};
  Object.keys(source).forEach(key => output[key] = replacer[key] || source[key]);
  return output;
}

console.log(result);
1 голос
/ 03 апреля 2019

Вы можете использовать _.pick() и _.keys() (или Object.keys()) от lodash, чтобы получить от 2-го объекта только ключи, которые существуют в 1-м объекте.Вы можете объединить исходный объект с выбранными ключами, используя распространение объекта:

const magicalFunction = (a, b) => ({ ...a, ..._.pick(b, _.keys(a)) });

const obj1 = {
  prop1: 'first thing',
  prop2: 'second thing'
};
const obj2 = {
  prop2: 'overridden second thing',
  prop3: 'and another thing'
};

const result = magicalFunction(obj1, obj2);

console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js"></script>
0 голосов
/ 03 апреля 2019

Вот, пожалуйста:

function magicalFunction (obj1, obj2) {
    let keys1 = Object.keys(obj1);
    let keys2 = Object.keys(obj2);

    for(let i=0; i<keys2.length; i++) {
        if(keys1.indexOf(keys2[i]) > -1) {
            obj1[keys2[i]] = obj2[keys2[i]];
        }
    }
return obj1;
}

Эта функция перебирает ключи обоих объектов и переопределяет значение, если ключ в obj2 также найден в obj1.

Надеюсь, это то, что выИщите.

...