Javascript 在数组中查找重复对象的有效方法
我和安格拉尔一起工作。我需要显示一个具有唯一值的列表 当访问API时,我会得到一个数组,从该数组中我只需要显示唯一的数据。我将在特定的时间间隔访问该api,并且仅当存在新数据时才需要更新列表Javascript 在数组中查找重复对象的有效方法,javascript,arrays,angular,typescript,unique,Javascript,Arrays,Angular,Typescript,Unique,我和安格拉尔一起工作。我需要显示一个具有唯一值的列表 当访问API时,我会得到一个数组,从该数组中我只需要显示唯一的数据。我将在特定的时间间隔访问该api,并且仅当存在新数据时才需要更新列表 response=[{“id”:“0DRDCH03DR51GGJGJNP80F7XZ8”,“value”:“36af1784bec4_566601260”},{“id”:“0DRDCFYGM2CAHAXYK96BPT9RHV”,“value”:“36af1784bec4_566601140”}, listD
response=[{“id”:“0DRDCH03DR51GGJGJNP80F7XZ8”,“value”:“36af1784bec4_566601260”},{“id”:“0DRDCFYGM2CAHAXYK96BPT9RHV”,“value”:“36af1784bec4_566601140”},
listData = [];
for(let data of response) {
let tempValue = {id: '', time: ''};
let value = data.value.split('_')
if (value.length==2) {
if(value[value.length-1].length==2) {
tempValue.id = value[0];
tempValue.time = value[1];
}
let isPresent = false;
if(this.listData.length>0){
for(let value of this.listData){
if(value.time===tempValue.time){
isPresent = true;
}
}
}
if(!isPresent) {
this.listData.push(tempValue);
}
}
}
最终列表数据
listData = [{id:'36af1784bec4', time: '566601140'},...]
上述函数确实为我提供了一个唯一的listData
数组。我尝试使用array.filter
和newset
,但未能达到预期效果
我想知道是否有一种有效的方法可以做到这一点。您可以通过以下代码删除重复项
var obj = {};
for ( var i=0, len=response.length; i < len; i++ )
obj[response[i]['id']] = response[i]; // if id Duplicate otherwise use value if the check on value.
response = new Array();
for ( var key in obj )
response.push(obj[key]);
console.log(response); // listData
我想这个就行了
for(let data of response) {
if(!this.listData.find((ldata) => data.value.substring(data.value.lastIndexOf('_')+1) === ldata.time)) {
let tempValue = {id: '', time: ''};
let value = data.value.split('_')
if (value.length==2) {
if(value[value.length-1].length==2) {
tempValue.id = value[0];
tempValue.time = value[1];
}
this.listData.push(tempValue);
}
}
}
您还可以通过
JSON.stringify
以下对象来实现这一点:
let响应=[{
“id”:“0DRDCH03DR51GGJGJNP80F7XZ8”,
“值”:“36af1784bec4_566601260”
}, {
“id”:“0DRDCFYGM2CAHAXYK96BPT9RHV”,
“值”:“36af1784bec4_566601140”
}, {
“id”:“0DRDCH03DR51GGJGJNP80F7XZ8”,
“值”:“36af1784bec4_566601260”
}]
设o=响应。减少((acc,cv)=>{
如果(!acc[JSON.stringify(cv)]){
acc[JSON.stringify(cv)]=true;//非虚假的东西
}
返回acc;
}, {});
让res=Object.keys(o.map)(x=>JSON.parse(x));
控制台日志(res)代码>用于优化解决方案(仅循环一次,即O(n))
使用对象属性检查属性是否已添加,这样可以避免循环查找属性是否已添加
下面是示例解决方案
let响应=[{
“id”:“0DRDCH03DR51GGJGJNP80F7XZ8”,
“值”:“36af1784bec4_566601260”
}, {
“id”:“0DRDCH03DR51GGJGJNP80F7XZ8”,
“值”:“36af1784bec4_566601260”
}, {
“id”:“0DRDCFYGM2CAHAXYK96BPT9RHV”,
“值”:“36af1784bec4_566601140”
}],
listData=[],
tempObj={};
for(让响应数据){
设value=data.value.split(“”);
如果(!tempObj.hasOwnProperty(值[1])){
tempObj[data.value[1]]=“”;
listData.push({
id:值[0],
时间:值[1]
});
}
}
console.log(listData)
您可以使用映射来收集ID,然后使用过滤器来删除重复项:
const response=[{“id”:“0DRDCH03DR51GGJGJNP80F7XZ8”,“value”:“36af1784bec4_566601260”},{“id”:“0DRDCFYGM2CAHAXYK96BPT9RHV”,“value”:“36af1784bec4_566601140”};
const id=response.map(it=>it.value.split(“”“)[0]).filter((it,i,arr)=>i==arr.indexOf(it))
控制台日志(ids)代码>最新版本的JavaScript允许依赖对象结构保持不变。。。因此,我们现在可以依靠字符串化和比较两个字符串:
JSON.stringify({id:0, name:foo}) === JSON.stringify({id:0, name:foo}) // true
因此,对于一组对象:
串接要测试的对象
在对象集合中循环,将每个对象串接起来
比较两者
这很有帮助,因为您不需要知道密钥名称。它只适用于任何对象类型
arr = [{object}, {object2}, {etc...}]
test = JSON.stringify(obj);
for ( let i = 0, j = arr.length; i < j; i++ ) {
let testAgainst = JSON.stringify(arr[i]);
if (test === testAgainst) {
console.log('matches');
} else {
console.log('no match');
}
}
arr=[{object},{object2},{etc..}]
test=JSON.stringify(obj);
for(设i=0,j=arr.length;i
现在您将匹配两个字符串。如果我遗漏了什么,请发表评论。如果您对新数据的定义是新的id
和value
,然后查找现有的数据可能比更新列表的成本更高。您可以将数组转换为@bigless。我尝试将数组转换为Set
,并尝试使用。has
,但它始终返回true
,即使listData
empty@gurvinder372我得到的响应具有id
和值
,但新的列表数据
是值。拆分(“')
和值[0]是id
,值[1]是时间
listData=[{id:'36af1784bec4',time:'566601260'},…]
@Tony Roczz yea我太天真了。它可能基于相同的引用…他想找到dup对象而不仅仅是dup ID的对象不是一个优化的解决方案,您正在循环两次,请检查我的解决方案:)考虑具有数千个唯一属性的输入,您会循环多次吗?我想知道您为什么要执行data.lastIndexOf(“”)+1
很抱歉,检查应该在顶部,我认为在拆分之前我们可以检查重复项,我不需要查找是否已添加属性。我需要避免添加重复的时间值。这是在拆分操作逻辑之后得到的,仍然保持不变,目前我正在检查完整的值属性。通过检查,如果属性已经添加,您可以避免通过输出循环检查此值是否已经添加。请注意JSON.stringify({a:1,b:2})!=stringify({b:2,a:1})
我发现解决这个问题的一个非常有效的方法是更新我的solution@TonyRoczz作为一个现代的2019年答案,这有帮助吗?
arr = [{object}, {object2}, {etc...}]
test = JSON.stringify(obj);
for ( let i = 0, j = arr.length; i < j; i++ ) {
let testAgainst = JSON.stringify(arr[i]);
if (test === testAgainst) {
console.log('matches');
} else {
console.log('no match');
}
}