在对象数组js中搜索值

时间:2017-08-27 07:26:01

标签: javascript arrays mutual-exclusion

我需要在对象数组中推送我的新对象并检查:新对象是否与start和end值存在的对象重叠。我写这个。我能缩短吗?或者可能有更好的方法来做到这一点?

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');
}

3 个答案:

答案 0 :(得分: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. 等值不应算作重叠。

答案 1 :(得分:0)

加上请检查您的逻辑是否有效 现有点(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是第二个 假设&lt; = b且c&lt; = d

两点重叠的条件是

a < d && b > c

这是您的overlaps功能可以使用的

请尝试为此编写代码并检查它是否无效

答案 2 :(得分:0)

如果 end 小于现有 end ,则启动也是如此。反过来也是如此,所以我们实际上只需要一个条件:

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