I would like to know whether array of object has same property value in javascript
for the array object list1
,
if name and country has same value, return true
if name same, any object country has value SG return true
if above two conditions fails, return false
var list1=[
{id:1, name: "sen", country: "IN"},
{id:2, name: "sen", country: "IN"}
]
const result1=checkObj(list1);
var list2=[
{id:1, name: "sen", country: "IN"},
{id:2, name: "sen", country: "SG"}
]
const result2=checkObj(list2);
var list3=[
{id:1, name: "sen", country: "IN"},
{id:2, name: "sen", country: "TH"}
]
const result3=checkObj(list3);
Expected Result:
//when passing list1
true
//when passing list2
true
//when passing list3
false
CodePudding user response:
Try this,
var list1=[
{id:1, name: "sen", country: "IN"},
{id:2, name: "sen", country: "IN"}
]
const result1=checkObj(list1);
console.log(result1);
var list2=[
{id:1, name: "sen", country: "IN"},
{id:2, name: "sen", country: "SG"}
]
const result2=checkObj(list2);
console.log(result2);
var list3=[
{id:1, name: "sen", country: "IN"},
{id:2, name: "sen", country: "TH"}
]
const result3=checkObj(list3);
console.log(result3);
function checkObj(list){
for(i=0;i<list.length;i )
{
for(j=0;j<list.length;j )
{
if(j!=i){
if(list[i].name==list[j].name){
if(list[i].country==list[j].country || list[i].country =='SG'){
return true;
}
}
}
}
}
return false;
}
CodePudding user response:
In the following snippet I put together an approach based on a single loop over all elements of an array. The occurrences of name
/country
combinations are collected in a local object o
and checked at the end of the function.
const data=[[
{id:1, name: "sen", country: "IN"},
{id:2, name: "sen", country: "IN"}
],[
{id:1, name: "sen", country: "IN"},
{id:2, name: "sen", country: "SG"},
{id:1, name: "sen", country: "DN"},
{id:1, name: "sen", country: "EN"}
],[
{id:1, name: "sen", country: "IN"},
{id:2, name: "sen", country: "TH"}
]];
function dupes(arr){
const o={}, // object o counts all occurrences
// the sort makes sure the "SG" items come last in ar
ar= arr.slice(0).sort((a,b)=>a.country==="SG" ? (b.country==="SG" ? 0 : 1) : -1);
// a single loop over ar:
ar.forEach(e=>{
if(e.country!=="SG"){ // "normal" countries:
let k=e.name "|" e.country;
o[k]=(o[k]||0) 1
} else { // for country=="SG"
for (let k in o)
if (k.indexOf(e.name "|")==0)
o[k] // increase counts for all elements starting with <el.name>|
}
});
return Object.values(o).some(n=>n>1)
}
data.forEach(d=>console.log(dupes(d)))