在对象数组中搜索值js
Search values in array of objects js
我需要将我的新对象放入对象数组并检查:新对象是否不与按起始值和结束值存在的对象重叠。我写这个。我可以缩短它吗?或者有更好的方法吗?
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');
}
另外请检查您的逻辑是否适用于
现有点 (10,20) 和要插入的点 (0, 30)
是的,可以改进
首先是基础提升
这两个if语句可以合并为一个
if( *full condition *) //push
第二次改进
将完整条件提取到函数中
function overlaps(obj1, obj2) {
// check overlap
}
然后对 find
函数的谓词使用 overlaps
函数
它将更具可读性
再改进:
你可以使重叠的条件更容易
为简单起见,让比较的两点为 (a,b) 和 (c,d)
// a,b 是第一个对象的开始和结束,c,d 是第二个对象
假设 a <= b 且 c <= d
两点重叠的条件是
a < d && b > c
这是您的 overlaps
函数可以使用的
请尝试为此编写代码并检查它是否不起作用
如果 end 小于现有的 end,start 也会。反之亦然,所以我们实际上只需要一个条件:
if (!arr.find(o =>
!( objToPush.end < o.start ||
objToPush.start > o.end )
)) arr.push(objToPush);
我们可以将其提取到一个函数中,如果失败,return 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}));
Ashish 一语中的,重叠比较太棒了!
对于任何需要快速的人:
const overlaps = (obj1, obj2) => (
obj1.start < obj2.end && obj1.end > obj2.start
);
const overlapExists = (arr, newObj) => (
arr.some(obj => overlaps(obj, newObj))
);
这是假设:
- 所有对象的
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');
}
另外请检查您的逻辑是否适用于 现有点 (10,20) 和要插入的点 (0, 30)
是的,可以改进
首先是基础提升
这两个if语句可以合并为一个
if( *full condition *) //push
第二次改进
将完整条件提取到函数中
function overlaps(obj1, obj2) {
// check overlap
}
然后对 find
函数的谓词使用 overlaps
函数
它将更具可读性
再改进: 你可以使重叠的条件更容易
为简单起见,让比较的两点为 (a,b) 和 (c,d)
// a,b 是第一个对象的开始和结束,c,d 是第二个对象
假设 a <= b 且 c <= d
两点重叠的条件是
a < d && b > c
这是您的 overlaps
函数可以使用的
请尝试为此编写代码并检查它是否不起作用
如果 end 小于现有的 end,start 也会。反之亦然,所以我们实际上只需要一个条件:
if (!arr.find(o =>
!( objToPush.end < o.start ||
objToPush.start > o.end )
)) arr.push(objToPush);
我们可以将其提取到一个函数中,如果失败,return 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}));
Ashish 一语中的,重叠比较太棒了!
对于任何需要快速的人:
const overlaps = (obj1, obj2) => (
obj1.start < obj2.end && obj1.end > obj2.start
);
const overlapExists = (arr, newObj) => (
arr.some(obj => overlaps(obj, newObj))
);
这是假设:
- 所有对象的
start
值都小于或等于它们的end
值。 - 相等的值不应算作重叠。