【问题标题】:How to elegantly check if any field has a longer value between two objects in JS?如何优雅地检查 JS 中两个对象之间是否有任何字段具有更长的值?
【发布时间】:2019-07-01 01:28:30
【问题描述】:
item1 = {a:[1], b:[2], c:[3]}
item2 = {a:[1], b:[2], c:[3,4]}

我可以编写一个冗长的for 循环来完成这项工作,但我想知道:是否有一种优雅的方法来检查任何字段是否具有长度值(在上面的示例中,item2c JS中两个对象之间比item1c)长吗?

【问题讨论】:

  • 有多长?似乎很简单的循环与检查。
  • 您能添加一个带有几个“冗长”字段/元素的漂亮示例输入吗?另外,最好添加您当前的循环,以便我们了解您的意思。
  • 是的,但我只是想知道 .map()、.forEach() 之类的东西是否可以导致单行解决方案
  • 您还需要知道哪些键更长吗?如果您只想知道item2 是否有一些比item1 更长的键,那么CertainPerformance 的答案应该涵盖您。
  • no 目的是监控是否有变化

标签: javascript syntactic-sugar


【解决方案1】:

只是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);

【讨论】:

  • +1 我将在适用于两个答案的问题 OP 中添加一个小注释:如果密钥不包含数组,这些解决方案可能不会给出预期的结果。我认为添加对边缘情况的检查超出了答案的范围,但值得注意的是,以防它们被盲目地复制/粘贴到生产代码中。
  • @NikKyriakides 是的,这假设两个项目中的键完全相同,并且所有值都是数组。如果这些事情是确定的,则只能“按原样”使用它。
【解决方案2】:

这是对其中一个对象的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);

或者,为了更频繁地使用它但降低可读性,您可以立即解构val1length 属性:

// 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);

【讨论】:

  • 我更喜欢循环遍历Object.keys,允许在回调中使用item2[key].length > item1[key].length,这对我来说看起来有点干净(虽然更长)。无论如何,答案很好,只是我的 0.02。
  • @NikKyriakides 当然给我一秒钟。
猜你喜欢
  • 2023-01-16
  • 2017-10-04
  • 2014-09-17
  • 2013-06-30
  • 1970-01-01
  • 1970-01-01
  • 2015-09-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多