如何在 JavaScript 中检查多个对象属性两次

How to check multiple object properties twice in JavaScript?

本文关键字:属性 两次 对象 JavaScript 检查      更新时间:2023-09-26

有很多不错的函数,如filter()hasOwnProperty()indexOf(),但我不知道如何处理它们在我的问题中。

首先,让我向您展示我当前的代码:

var Lines = [];
// [..] pushing a lot of objects in the Lines Array, now it is like this:
Lines[0] = {line: 'a', x: 2, y: 4, z: 3, visible: true}
Lines[1] = {line: 'b', x: 3, y: 4, z: 3, visible: true}
Lines[2] = {line: 'c', x: 5, y: 3, z: 3, visible: true}
Lines[3] = {line: 'd', x: 1, y: 4, z: 3, visible: true}
Lines[4] = {line: 'e', x: 2, y: 4, z: 3, visible: true}//same as Lines[0]
Lines[5] = {line: 'f', x: 6, y: 6, z: 3, visible: true}
Lines[6] = {line: 'g', x: 5, y: 7, z: 3, visible: true}
Lines[7] = {line: 'h', x: 3, y: 4, z: 3, visible: true}//same as Lines[1]
//..

现在我想有一个函数,我可以在 x 和 y 相同的多行中。(在示例中index 0 & 4相同,7 和 1 相同)如果同一x & y位置有两条线,则设置为 visible 为 false,否则设置为 true。

现在的问题:如何检查数组中的多个对象属性(x & y 必须相同)并处理它们?

var index = {},
    lines = [/* your lines here */];
lines.forEach(function (line) {
    var key = line.x + ':' + line.y;
    line.visible = !(key in index);
    index[key] = true;    
});
  1. 创建一个索引(对象),其中包含要检查唯一性的属性。
  2. 在您的情况下,xy 的组合将是唯一的属性(即key)。我们可以为此使用一个单独的字符串: line.x + ':' + line.y .注意使用在xy中不能自然出现的分隔符,冒号对数字很好。
  3. 逐行浏览,检查它们的key是否已经在索引中。如果是,请使它们不可见,反之亦然。
  4. 将密钥存储在索引中,重复此操作。

一个简单的(尽管如果数组变得非常大,则效率不高)是遍历数组并检查是否有任何重复项,如下所示:

for (var i=0;i<Lines.length;i++) {
    for (var j=i+1;j<Lines.length;j++) {
        if (Lines[i].x==Lines[j].x&&Lines[i].y==Lines[j].y) {
            Lines[j].visible = false;
            //...and whatever action you want to perform on a duplicate
        }
    }
}