【问题标题】:Search values in array of objects js在对象数组中搜索值js
【发布时间】:2017-08-27 07:26:00
【问题描述】:

我需要将我的新对象推送到对象数组中并检查:如果新对象不与开始值和结束值存在的对象重叠。我写这个。我可以让它更短吗?或者也许有更好的方法来做到这一点?

let arr = [
    {
        start: 0,
        end: 10
    },
    {
        start: 30,
        end: 40
    },
    {
        start: 60,
        end: 70
    },
    {
        start: 100,
        end: 110
    },
    {
        start: 140,
        end: 150
    },
    {
        start: 180,
        end: 190
    }
];

let objToPush = {
    start: 45,
    end: 50
}

if (!arr.find(o => objToPush.start > o.start && objToPush.start < o.end)) {
    if (!arr.find(o => objToPush.end > o.start && objToPush.end < o.end)) {
        console.log('push');
        arr.push(objToPush);
    } else {
        console.log('not push');
    }
} else {
    console.log('not push');
}

【问题讨论】:

  • 生成一个查找表,这样您就不需要一遍又一遍地搜索整个结构
  • 感谢您的解决方案,但我对 js 有点陌生。查找表是什么意思?它是另一个对象吗?
  • @redu,没有他的代码不起作用。
  • @SPHINX 那么您认为这对 OP 有何帮助? ://

标签: javascript arrays mutual-exclusion


【解决方案1】:

Ashish 一针见血,这种重叠比较太棒了!

对于任何需要它的人来说:

const overlaps = (obj1, obj2) => (
  obj1.start < obj2.end && obj1.end > obj2.start
);

const overlapExists = (arr, newObj) => (
  arr.some(obj => overlaps(obj, newObj))
);

这是假设:

  1. 所有对象的start 值都小于或等于它们的end 值。
  2. 相等的值不应算作重叠。

【讨论】:

    【解决方案2】:

    另外,请检查您的逻辑是否适用 现有点 (10,20) 和要插入的点 (0, 30)

    是的,可以改进

    首先是基本的改进

    这两个 if 语句可以合并为一个

    if( *full condition *) //push

    第二次改进

    将完整条件提取到函数中

    function overlaps(obj1, obj2) {
      // check overlap
    }
    

    然后使用overlaps 函数作为find 函数的谓词 它会更具可读性

    另一个改进: 你可以让重叠的条件更容易

    为简单起见,让要比较的两个点分别为 (a,b) 和 (c,d)
    // a,b 是第一个对象的开始和结束,而 c,d 是第二个对象
    假设 a

    两点重叠的条件是

    a &lt; d &amp;&amp; b &gt; c

    这是你的overlaps 函数可以使用的

    请尝试为此编写代码并检查它是否不起作用

    【讨论】:

      【解决方案3】:

      如果 end 小于现有的 end,则 start 也会变小。反过来也一样,所以我们实际上只需要一个条件:

      if (!arr.find(o => 
       !( objToPush.end < o.start ||
          objToPush.start > o.end )
      )) arr.push(objToPush);
      

      我们可以将其提取到一个函数中,如果失败则返回 false:

      const add = objToPush => !arr.find(o => 
       !( objToPush.end < o.start ||
          objToPush.start > o.end )
      )) && arr.push(objToPush);
      
      console.log(add({start:5,end:15}));
      

      In action

      【讨论】:

        猜你喜欢
        • 2011-11-26
        • 2012-01-20
        • 2015-07-30
        • 2020-06-11
        • 1970-01-01
        • 2013-12-18
        • 2017-01-10
        • 2021-12-19
        • 1970-01-01
        相关资源
        最近更新 更多