Javascript 在数组中查找重复对象的有效方法

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

我和安格拉尔一起工作。我需要显示一个具有唯一值的列表

当访问API时,我会得到一个数组,从该数组中我只需要显示唯一的数据。我将在特定的时间间隔访问该api,并且仅当存在新数据时才需要更新列表

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');
      }
    }