Преобразовать ключ в пары при условии? - PullRequest
1 голос
/ 03 мая 2020

У меня есть универсальный c объект и объект, который определяет пару ключей:

const obj = {
   key1: 1,
   key2: 2,
   key3: 3,
};

const pairs = {
  'key1:key3': 666,
};

Результирующий объект в этом случае будет:

const result = {
  'key1:key3': 666,
  key2: 2
};

Пары имеют больший приоритет, если оба ключи в паре присутствуют в исходном объекте, тогда берется пара со значением, иначе берется один ключ / val. Например, другой сценарий:

const obj = {
   key1: 1,
   key2: 2,
   key4: 3,
};

const pairs = {
  'key1:key3': 666,
};

const result = {
   key1: 1,
   key2: 2,
   key4: 3,
};

// same as obj, because no key1 and key3 is present

Как мне добиться этих логи c с loda sh?

Ответы [ 2 ]

1 голос
/ 03 мая 2020

Это решение не завершено, но вы можете расширить эту логику c, чтобы решить вашу проблему.

/** const obj = {
   key1: 1,
   key2: 2,
   key4: 3,
};

const pairs = {
  'key1:key3': 666,
};
**/

const obj = {
  key1: 1,
  key2: 2,
  key3: 3,
};

const pairs = {
  'key1:key3': 666,
};

const pairKeys = Object.keys(pairs);

pairKeys.forEach((key) => {
  const keys = key.split(':');
  const isAllKeysPresent = keys.every(k => {
    return !!obj[k]; // returns boolean
  });

  const objCopy = { ...obj
  };
  if (isAllKeysPresent) {
    keys.forEach(k => {
      delete objCopy[k];
    })

    console.log({ ...pairs,
      ...objCopy
    })
  } else {
    console.log(objCopy)
  }
})
0 голосов
/ 03 мая 2020

Вам нужно уменьшить pairs объект и начальные obj в новый объект:

const obj = {
   key1: 1,
   key2: 2,
   key4: 3,
};

const pairs = {
  'key1:key3': 666,
};

let result = Object.keys(pairs).reduce((carr, curr) => {
   if (typeof curr === 'string') {
      let needles = curr.split(':')
      
      if (needles.every(k => Object.keys(obj).includes(k))) {
         needles.forEach(n => {
            delete carr[n]
         })
         
         return Object.assign(carr, { [curr]: pairs[curr] })
      }
   }
   
   return carr
}, Object.assign({}, { ...obj }))

console.log(result)
...