Как элегантно проверить, имеет ли какое-либо поле более длинное значение между двумя объектами в JS? - PullRequest
0 голосов
/ 07 февраля 2019
item1 = {a:[1], b:[2], c:[3]}
item2 = {a:[1], b:[2], c:[3,4]}

Я могу написать длинный цикл for для выполнения этой работы, но мне интересно: есть ли элегантный способ проверить, имеет ли какое-либо поле значение длины (в приведенном выше примере item2c длиннее item1 * c) между двумя объектами в JS?

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Просто альтернатива отличному решению CertainPerformance, так как кто-то предложил мне опубликовать его в другом ответе.

Он просто использует Object.keys вместо Object.entries и может выглядеть чище, даже если он на 99% одинаков:

const item1 = {a:[1], b:[2], c:[3]};
const item2 = {a:[1], b:[2], c:[3,4]};

const anyInItem2Bigger = Object.keys(item1)
  .some(key => item2[key].length > item1[key].length);

Чтобы добавить что-то более ценное, если вам нужно получить фактический список ключей с более длинными элементами, вы можете использовать Array.reduce:

const item1 = {a:[1], b:[2], c:[3]};
const item2 = {a:[1], b:[2], c:[3,4]};
    
const longerKeysInItem2 = Object.keys(item1)
  .reduce((lk, key) => item2[key].length > item1[key].length ? [...lk, ...[key]] : lk, []);
  
console.log(longerKeysInItem2);
0 голосов
/ 07 февраля 2019

Это довольно простая итерация для Object.entries одного из объектов, совсем не похоже на длительность:

// assuming that both objects will contain the same keys:
const item1 = {a:[1], b:[2], c:[3]};
const item2 = {a:[1], b:[2], c:[3,4]};

const anyInItem2Bigger = Object.entries(item1)
  .some(([key, val1]) => item2[key].length > val1.length);
console.log(anyInItem2Bigger);

Или, чтобы играть в гольф больше, но сделать его менее читабельным, вы можете немедленно деструктурировать свойство length val1:

// assuming that both objects will contain the same keys:
const item1 = {a:[1], b:[2], c:[3]};
const item2 = {a:[1], b:[2], c:[3,4]};

const anyInItem2Bigger = Object.entries(item1)
  .some(([key, { length }]) => item2[key].length > length);
console.log(anyInItem2Bigger);
...