检查动态填充的数组中的重复对象

问题描述 投票:1回答:3

我正在尝试构建一个数据结构,其中所有元素将根据对象键进行分组。

一切正常,但我无法检查新数组是否有重复的数据,因为它在for..of循环之外。我正在寻找一种方法来阻止pushing另一个对象,如果新阵列已经有它。

当前输出(请注意,日本的字符列表出现两次)

[
  [
    { "country": "US" },
    [
      { "name": "Guile", "country": "US" }
    ]
  ],
  [
    { "country": "Japan" },
    [
      { "name": "E. Honda", "country": "Japan" },
      { "name": "Ryu", "country": "Japan" }
    ]
  ],
  [
    { "country": "Japan" },
    [
      { "name": "E. Honda", "country": "Japan" },
      { "name": "Ryu", "country": "Japan" }
    ]
  ],
  [
    { "country": "Thailand" },
    [
      { "name": "Sagat", "country": "Thailand" }
    ]
  ]
]

预期产出

[
  [
    { "country": "US" },
    [
      { "name": "Guile", "country": "US" }
    ]
  ],
  [
    { "country": "Japan" },
    [
      { "name": "E. Honda", "country": "Japan" },
      { "name": "Ryu", "country": "Japan" }
    ]
  ],
  [
    { "country": "Thailand" },
    [
      { "name": "Sagat", "country": "Thailand" }
    ]
  ]
]

到目前为止我有什么

var data = [
  {name: 'Guile', country: 'US'},
  {name: 'E. Honda', country: 'Japan'},
  {name: 'Ryu', country: 'Japan'},
  {name: 'Sagat', country: 'Thailand'}
]

const getNationList = (streetFighterList) => {
  let filteredList = []
  for (const [index, characterData] of streetFighterList.entries()) {
    // .......................................................
    // looking for ways here to check if `filteredList` already
    // has the data I'm trying to push. Since it's empty
    // I don't know how to check its index. :(
    // NOTE: indexOf() doesn't seem to work
    // .......................................................
    const indexOf = filteredList.indexOf(streetFighterList[index].country)
    if (indexOf == -1) {
      filteredList.push([
        { country: characterData.country },
        streetFighterList.filter((character) => {
          return character.country === characterData.country
        })
      ])
    }
  }
  return filteredList
}

console.log(getNationList(data))

注意:我理解,鉴于country对象始终是唯一的,如果我使用字符串代替,这种数据结构会更好更容易。然而,这是一个示例数据,在现实生活中的代码中,我确实需要将其存储为对象。

javascript arrays loops for-loop
3个回答
1
投票

我建议使用一些来验证如下

var data = [
  {name: 'Guile', country: 'US'},
  {name: 'E. Honda', country: 'Japan'},
  {name: 'Ryu', country: 'Japan'},
  {name: 'Sagat', country: 'Thailand'}
]

const getNationList = (streetFighterList) => {
  let filteredList = []
  for (const [index, characterData] of streetFighterList.entries()) {

    const entry = filteredList.some(item => item[0].country === streetFighterList[index].country)
    if (!entry) {
      filteredList.push([
        { country: characterData.country },
        streetFighterList.filter((character) => {
          return character.country === characterData.country
        })
      ])
    }
  }
  return filteredList
}

console.log(getNationList(data))

1
投票

将数组减少为对象,将国家/地区名称作为键。将同一国家/地区的玩家与一个对象组合,并将玩家的名称作为关键。

完成后,使用Object.values()转换回数组,并映射数组以通过Object.values()将玩家的对象转换为数组。

const data = [[{"country":"US"},[{"name":"Guile","country":"US"}]],[{"country":"Japan"},[{"name":"E. Honda","country":"Japan"},{"name":"Ryu","country":"Japan"}]],[{"country":"Japan"},[{"name":"E. Honda","country":"Japan"},{"name":"Ryu","country":"Japan"}]],[{"country":"Thailand"},[{"name":"Sagat","country":"Thailand"}]]]

const result = Object.values(data.reduce((r, [c, p]) => { 
  if(!r[c.country]) r[c.country] = [c, {}]
  
  const players = r[c.country][1];
  
  p.forEach(o => { if(!players[o.name]) players[o.name] = o; })
  
  return r;
}, {})).map(([c, p]) => [c, Object.values(p)]);

console.log(result)

1
投票

你可以先创建一个独特国家的Set然后循环它们,将每个国家与该国的战士列表结合起来。例如:

const data = [
  {name: 'Guile', country: 'US'},
  {name: 'E. Honda', country: 'Japan'},
  {name: 'Ryu', country: 'Japan'},
  {name: 'Sagat', country: 'Thailand'}
];

const countries = new Set(data.map(x => x.country));
let countryData = [];
for (let c of countries) {
  countryData.push([{country: c}, data.filter(x => x.country === c)]);
}

console.log(countryData);
/*
[
  [
    {"country": "US"},
    [{"name": "Guile", "country": "US"}]
  ],
  [
    {"country": "Japan"},
    [{"name": "E. Honda", "country": "Japan"}, {"name": "Ryu", "country": "Japan" }]
  ],
  [
    {"country": "Thailand"},
    [{"name": "Sagat", "country": "Thailand"}]
  ]
]
*/
© www.soinside.com 2019 - 2024. All rights reserved.