2017-07-01 36 views
-2

我有对象的一个​​这样的数组:的JavaScript得到所有匹配的邻居

const arr = [{ 
    label: [1,1] 
}, 
{ 
    label: [1,0.5] 
}, 
{ 
    label: [1,0.5] 
} 
,{ 
    label: [1,0.5] 
} 
,{ 
    label: [1,1] 
}] 

我然后我有一个指标值,假设值是2。这将对应于:

{ 
    label: [1,0.5] 
} 

现在,我想根据标签值查找所有的索引或对象。我正在做比较的方式是label.join(',') ===,这很好。

在此示例数组中,在提供的索引2之前和之后会有一个。

我可以遍历,但不知道如何去“之前或之后”,特别是因为之前或之后可能会有很多。

这结束了工作进行的顺利:从给定的索引开始,前进后退阵列中

const index = 3; 
const first = _.first(arr, index).reverse() 
const rest = _.rest(arr, index + 1) 
let found = [] 

for (let i = 0; first.length; i++) { 
    if (first[i].label.join(',') == arr[index].label.join(',')) { 
    found.push(first[i]) 
    } else { 
    break; 
    } 
} 

for (let i = 0; rest.length; i++) { 
    if (rest[i].label.join(',') == arr[index].label.join(',')) { 
    found.push(rest[i]) 
    } else { 
    break; 
    } 
} 
+0

它应该是邻居的consequtive链? – RomanPerekhrest

+0

“旁边的”是什么意思? – Barmar

+1

我不明白。如果idx == 2,那么你有'arr [idx-1]'和'arr [idx + 1]' – mplungjan

回答

0

使用循环。

在循环之后,您需要调整找到的索引,因为它在找到不匹配的元素时结束。

const array = [{ 
 
    label: [1, 1] 
 
    }, 
 
    { 
 
    label: [1, 0.5] 
 
    }, 
 
    { 
 
    label: [1, 0.5] 
 
    }, { 
 
    label: [1, 0.5] 
 
    }, { 
 
    label: [1, 1] 
 
    } 
 
]; 
 

 
const n = 2; 
 
const label = array[n].label; 
 
var start = n; 
 
var end = n; 
 
if (n > 0) { 
 
    for (start = n - 1; start >= 0; start--) { 
 
    if (array[start].label[0] != label[0] || array[start].label[1] != label[1]) { 
 
     break; 
 
    } 
 
    } 
 
    start++; 
 
} 
 
if (n < array.length - 1) { 
 
    for (end = n + 1; end < array.length; end++) { 
 
    if (array[end].label[0] != label[0] || array[end].label[1] != label[1]) { 
 
     break; 
 
    } 
 
    } 
 
    end--; 
 
} 
 
console.log(start, end);

+0

谢谢@Barmar我最终使用了类似的解决方案,我添加到问题,这是接近的,但用lodash清理它,无法检查标签的索引,需要检查完整的数组值 – dzm

+0

您应该发布您的解决方案作为答案,而不是问题。 – Barmar