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

时间:2015-02-04 08:04:22

标签: javascript

有许多不错的功能,例如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位置有两行,则将其设置为false,否则将其设置为true。

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

2 个答案:

答案 0 :(得分:1)

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. 将密钥存储在索引中,重复。

答案 1 :(得分:0)

一个简单的(如果数组变得非常大,虽然不是很有效)解决方案是通过数组并检查任何重复项,如下所示:

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
        }
    }
}