如何检查对象数组中是否同时重复了两个相同的属性?
How to check if in an array of objects two equal properties are repeated at the same time?
我有以下对象数组:
[
{
homeGate: "gate_0",
homeTerminal: "1",
destinationGate: "gate_0",
destinationTerminal: "2"
},
{
homeGate: "gate_0",
homeTerminal: "1",
destinationGate: "gate_0",
destinationTerminal: "3"
},
{
homeGate: "gate_1",
homeTerminal: "1",
destinationGate: "gate_1",
destinationTerminal: "2"
},
{
homeGate: "gate_1",
homeTerminal: "2",
destinationGate: "gate_1",
destinationTerminal: "3"
},
]
我需要检查哪些对象同时重复值 "homeTerminal" 和 "destinationTerminal"。正如我们在示例中看到的,我需要同时检索在两个属性中具有相同值的第一个和第三个对象。
我试图制作一张地图,但我只能用一个值来做,而且我不知道如何通过一次检查两个值来做。
提前谢谢你。
var arr=[
{
homeGate: "gate_0",
homeTerminal: "1",
destinationGate: "gate_0",
destinationTerminal: "2"
},
{
homeGate: "gate_0",
homeTerminal: "1",
destinationGate: "gate_0",
destinationTerminal: "3"
},
{
homeGate: "gate_1",
homeTerminal: "1",
destinationGate: "gate_1",
destinationTerminal: "2"
},
{
homeGate: "gate_1",
homeTerminal: "2",
destinationGate: "gate_1",
destinationTerminal: "3"
},
]
var r=[];
arr.forEach((element,index) => {
for(let i=index;i<arr.length;i++){
if(element.homeTerminal==arr[i].homeTerminal&&element.destinationGate==arr[i].destinationGate){
if(!r.includes(element))r.push(element);
if(!r.includes(arr[i]))r.push(arr[i]);
}
}
});
应该可以。你在 r array
中得到结果
您可以使用由字段 homeTerminal 和 destinationTerminal.
组成的复合键来计算 lookup/map
然后使用该查找查找重复元素。
const lkp = data.reduce((lkp, cur) => {
const {homeTerminal, destinationTerminal} = cur;
const key = `${homeTerminal}~~${destinationTerminal}`;
lkp[key] = lkp[key] || [];
lkp[key].push(cur);
return lkp;
}, {});
console.log (lkp);
for (const key in lkp) {
if (lkp[key].length > 1)
console.log ("Duplicate entry", lkp[key])
}
<script>var data = [
{
homeGate: "gate_0",
homeTerminal: "1",
destinationGate: "gate_0",
destinationTerminal: "2"
},
{
homeGate: "gate_0",
homeTerminal: "1",
destinationGate: "gate_0",
destinationTerminal: "3"
},
{
homeGate: "gate_1",
homeTerminal: "1",
destinationGate: "gate_1",
destinationTerminal: "2"
},
{
homeGate: "gate_1",
homeTerminal: "2",
destinationGate: "gate_1",
destinationTerminal: "3"
},
]</script>
您可以 reduce
数组以获得所需的结果。
var arr = [{
homeGate: "gate_0",
homeTerminal: "1",
destinationGate: "gate_0",
destinationTerminal: "2"
}, {
homeGate: "gate_0",
homeTerminal: "3",
destinationGate: "gate_0",
destinationTerminal: "2"
}, {
homeGate: "gate_1",
homeTerminal: "1",
destinationGate: "gate_1",
destinationTerminal: "2"
}, {
homeGate: "gate_2",
homeTerminal: "1",
destinationGate: "gate_2",
destinationTerminal: "2"
}, {
homeGate: "gate_1",
homeTerminal: "2",
destinationGate: "gate_1",
destinationTerminal: "3"
}, {
homeGate: "gate_1",
homeTerminal: "3",
destinationGate: "gate_1",
destinationTerminal: "2"
}]
var result = arr.reduce((retArr, item) => {
// condition to avoid duplication
if (!retArr.includes(item)) {
var filteredArr = arr.filter((i) => {
return i.homeTerminal === item.homeTerminal && i.destinationTerminal === item.destinationTerminal;
});
if (filteredArr.length > 1) retArr = [...retArr, ...filteredArr];
}
return retArr;
}, []);
console.log(result);
reduce
Array 原型方法有两个参数:
- 为数组的每个元素执行的回调函数。
- 返回值的初始值
- 这个值必须从回调函数返回
回调函数依次接受 3 个参数:
- return_value (
retArr
)
- 数组元素(
item
)
- 索引未被使用
可以对数组元素进行任何操作,结果必须反映在return_value中(此处为展开值的联系操作)
更多关于 reduce
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce
我有以下对象数组:
[
{
homeGate: "gate_0",
homeTerminal: "1",
destinationGate: "gate_0",
destinationTerminal: "2"
},
{
homeGate: "gate_0",
homeTerminal: "1",
destinationGate: "gate_0",
destinationTerminal: "3"
},
{
homeGate: "gate_1",
homeTerminal: "1",
destinationGate: "gate_1",
destinationTerminal: "2"
},
{
homeGate: "gate_1",
homeTerminal: "2",
destinationGate: "gate_1",
destinationTerminal: "3"
},
]
我需要检查哪些对象同时重复值 "homeTerminal" 和 "destinationTerminal"。正如我们在示例中看到的,我需要同时检索在两个属性中具有相同值的第一个和第三个对象。
我试图制作一张地图,但我只能用一个值来做,而且我不知道如何通过一次检查两个值来做。 提前谢谢你。
var arr=[
{
homeGate: "gate_0",
homeTerminal: "1",
destinationGate: "gate_0",
destinationTerminal: "2"
},
{
homeGate: "gate_0",
homeTerminal: "1",
destinationGate: "gate_0",
destinationTerminal: "3"
},
{
homeGate: "gate_1",
homeTerminal: "1",
destinationGate: "gate_1",
destinationTerminal: "2"
},
{
homeGate: "gate_1",
homeTerminal: "2",
destinationGate: "gate_1",
destinationTerminal: "3"
},
]
var r=[];
arr.forEach((element,index) => {
for(let i=index;i<arr.length;i++){
if(element.homeTerminal==arr[i].homeTerminal&&element.destinationGate==arr[i].destinationGate){
if(!r.includes(element))r.push(element);
if(!r.includes(arr[i]))r.push(arr[i]);
}
}
});
应该可以。你在 r array
中得到结果您可以使用由字段 homeTerminal 和 destinationTerminal.
组成的复合键来计算 lookup/map然后使用该查找查找重复元素。
const lkp = data.reduce((lkp, cur) => {
const {homeTerminal, destinationTerminal} = cur;
const key = `${homeTerminal}~~${destinationTerminal}`;
lkp[key] = lkp[key] || [];
lkp[key].push(cur);
return lkp;
}, {});
console.log (lkp);
for (const key in lkp) {
if (lkp[key].length > 1)
console.log ("Duplicate entry", lkp[key])
}
<script>var data = [
{
homeGate: "gate_0",
homeTerminal: "1",
destinationGate: "gate_0",
destinationTerminal: "2"
},
{
homeGate: "gate_0",
homeTerminal: "1",
destinationGate: "gate_0",
destinationTerminal: "3"
},
{
homeGate: "gate_1",
homeTerminal: "1",
destinationGate: "gate_1",
destinationTerminal: "2"
},
{
homeGate: "gate_1",
homeTerminal: "2",
destinationGate: "gate_1",
destinationTerminal: "3"
},
]</script>
您可以 reduce
数组以获得所需的结果。
var arr = [{
homeGate: "gate_0",
homeTerminal: "1",
destinationGate: "gate_0",
destinationTerminal: "2"
}, {
homeGate: "gate_0",
homeTerminal: "3",
destinationGate: "gate_0",
destinationTerminal: "2"
}, {
homeGate: "gate_1",
homeTerminal: "1",
destinationGate: "gate_1",
destinationTerminal: "2"
}, {
homeGate: "gate_2",
homeTerminal: "1",
destinationGate: "gate_2",
destinationTerminal: "2"
}, {
homeGate: "gate_1",
homeTerminal: "2",
destinationGate: "gate_1",
destinationTerminal: "3"
}, {
homeGate: "gate_1",
homeTerminal: "3",
destinationGate: "gate_1",
destinationTerminal: "2"
}]
var result = arr.reduce((retArr, item) => {
// condition to avoid duplication
if (!retArr.includes(item)) {
var filteredArr = arr.filter((i) => {
return i.homeTerminal === item.homeTerminal && i.destinationTerminal === item.destinationTerminal;
});
if (filteredArr.length > 1) retArr = [...retArr, ...filteredArr];
}
return retArr;
}, []);
console.log(result);
reduce
Array 原型方法有两个参数:
- 为数组的每个元素执行的回调函数。
- 返回值的初始值
- 这个值必须从回调函数返回
回调函数依次接受 3 个参数:
- return_value (
retArr
) - 数组元素(
item
) - 索引未被使用
可以对数组元素进行任何操作,结果必须反映在return_value中(此处为展开值的联系操作)
更多关于 reduce
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce