Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/448.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如果密钥可用,则从数组中删除重复的对象_Javascript_Arrays - Fatal编程技术网

Javascript 如果密钥可用,则从数组中删除重复的对象

Javascript 如果密钥可用,则从数组中删除重复的对象,javascript,arrays,Javascript,Arrays,我测试了我所知道的一切,并进行了搜索,但没有任何效果。 我有一个数组,这个数组包含灵活的对象 let filter = [ { key1: "stringReq" }, { key1: "1" }, { key1: "2" }, { key1: "3" }, { key1: "someString" }, { key2: "stringRe

我测试了我所知道的一切,并进行了搜索,但没有任何效果。 我有一个数组,这个数组包含灵活的对象

let filter = [
    { key1: "stringReq" },
    { key1: "1" },
    { key1: "2" },
    { key1: "3" },
    { key1: "someString" },
    { key2: "stringReq" },
    { key2: "5" },
    { key2: "6" },
    { key2: "7" },
    { key3: "string" }
];
现在我想要一个数组,对象如下

let filter = [
    { key1: "stringReq" },
    { key2: "stringReq" },
    { key3: "string" }
];

我只需要数组中的一个键。这是我的代码中的一个示例,我没有任何键或值的信息,它是一个包含数据的变量数组。

看起来您希望在对象中第一次找到每个特定键时获取属性值。以下内容将返回:

让arr=[{key1:stringReq},{key1:1},{key1:2},{key1:3},{key1:someString},{key2:stringReq},{key2:5},{key2:6},{key2:7},{key3:string}];
const res=对象项(arr.reduce((a,c)=>{
设[[k,v]]=Object.entries(c);
如果(!a[k])a[k]=v
返回a;
}.map(e=>Object.fromEntries([e]);

控制台日志(res)假设您有一个对象数组,并且这些对象每个都有一个键,那么您可以创建一个主字典来存储在子对象中找到的所有键。如果键已经存在,它将忽略新值,保留找到的第一个值

// create an object to store the unique ids
const dict = {};

// for each element of the array, take the first key found and use it as a key in the dict
filter.forEach(element => {
    const childKey = Object.keys(element)[0];
    if(!Object.hasOwnProperty(dict,childKey)){
        dict[childKey] = element;
    }
})

// now get the values from the dict
const result = Object.values(dict);
console.log(result);

好的,根据你的描述,你可以这样做:

这是您的列表
filter

 const filter = [
  { key1: 'stringReq' },
  { key1: '1' },
  { key1: '2' },
  { key1: '3' },
  { key1: 'someString' },
  { key2: 'stringReq' },
  { key2: '5' },
  { key2: '6' },
  { key2: '7' },
  { key3: 'string' }
];
首先使用其
filter()
方法删除所有值不大于1的对象

// remove all entries that are 1 character long
const step1 = filter.filter(element => {
  const outerArray = Object.entries(element)[0];
  if (outerArray[1]) {
    return outerArray[1].length > 1;
  } else {
    return false;
  }
});
接下来,通过将所有对象添加到字段名为
key
的映射中,删除重复的键名。因为映射只接受每个键一次。DUP将被删除,而不会添加

// remove duplicates
const map: Map<string, any> = new Map<string, any>();

filter.forEach(element => {
  const outerArray = Object.entries(element)[0];
  if (outerArray[0]) {
    map.set(outerArray[0], element);
  }
});

解决方案使用集合作为
Array#filter()
thisArg
返回第一个出现的关键点,以跟踪已看到的内容

让arr=[
{key1:“stringReq”},
{key1:“1”},
{key1:“2”},
{key1:“3”},
{key1:“someString”},
{key2:“stringReq”},
{key2:“5”},
{key2:“6”},
{key2:“7”},
{key3:“字符串”}
];
常数res=arr.filter(函数(o){
常数[k]=对象键(o);
返回this.has(k)?false:(this.add(k),true);
},新集合());

console.log(res)
解决所有此类问题的一般方法是创建一个对象,该对象的键是要使其唯一的任何字段。要获取对象的键,请使用
object.keys()
。如果它只有一个属性,请使用
Object.keys(obj)[0]
获取该密钥。StackOverflow不是免费的编码服务。你应该会的。请更新您的问题,以显示您已在某个应用程序中尝试过的内容。有关更多信息,请参阅并采用:)理论上听起来不错,但OP的预期结果是第一次出现,但此覆盖方法返回last occurrence Correct。编辑谢谢大家的快速回答。但是来自的解决方案对我来说很好。一个问题是,如果我想检查对象的值,而不是过滤器,有多困难?例如'arr=[{key1:searchedValue},{key1:1},{key1:2},{key2:date},{key2:date2},{key3:“string”}',现在我想要一个数组,该数组的对象带有key1:searchedValue(我想搜索的这个值)、key2:date、key2:date2、key3。@charlietfl我非常喜欢你的方法,相信它会奏效。不幸的是,它在我的Android Chrome上不起作用,而是返回
arr
的所有元素。谢谢你的解决方案,它可以工作,但我在这里得到一个对象,我需要一个数组。是的-我添加了一个
object.entries()
和一个
object.fromEntries()
。现在它返回一个数组。很好,很好,谢谢。你知道我该如何检查价值吗?”arr=[{key1:searchedValue},{key1:1},{key1:2},{key2:date},{key2:date2},{key3:“string”}],现在我想要一个数组,其中的对象带有key1:searchedValue(我要搜索的这个值)、key2:date、key3
const final = Array.from(map);

console.log(final);