2017-02-21 8 views
0

Я бегу в странный сбой. У меня есть немного кода, в котором я запускаю массив массивов, захватывая кучу названий городов и объединяя их все вместе. Мне нужно удалить дубликаты из готового списка. Это должно быть довольно просто. Используйте подсчет, чтобы выяснить, в каком городе более одного экземпляра, а затем сплайсируйте их. Мой возвращенный массив не выходит правильно, хотя и я не уверен, почему. Может ли кто-нибудь определить, что я делаю неправильно?Weird hiccup удаление дубликатов из массива

const input = [ 
{ 
    name: "ACH2000", 
    year: 2005, 
    cities: ['Chicago', 'New York', 'Ames', 'Columbus'], 
    ages: [12, 32, 2, 51] 
}, 
{ 
    name: "FXG3000", 
    year: 2008, 
    cities: ['Chicago', 'Joliet', 'Plymouth', 'Dallas'], 
    ages: [12, 32, 2, 51] 
}, 
{ 
    name: "GTG1234", 
    year: 2012, 
    cities: ['Indy', 'Tampa', 'Houston', 'Dallas'], 
    ages: [12, 32, 2, 51] 
} 
]; 

function getUniqueCities(data){ 
    let citiesInArray = data.map(function(item){ return item.cities }); 
    let concatCities = [].concat.apply([], citiesInArray); 
    let count = {}; 
    for(let i = 0; i< concatCities.length; i++) { 
     let num = concatCities[i]; 
     count[num] = count[num] ? count[num]+1 : 1; 
     if(count[num] > 1){ 
     console.log('bad',num); 
     concatCities.splice(num, 1); 
     } else { 
     console.log('good',num); 
     } 
    } 
    console.log(count); 
    console.log(concatCities); 
} 

getUniqueCities(input); 
+2

Вам действительно нужно знать, какие города появились более одного раза, или достаточно просто вернуть список без дубликатов? В любом случае, подумайте о том, что происходит с индексами элементов в массиве * после того, как * вы являетесь элементом '.splicing()' out ... – nnnnnn

+0

который является возвращенным массивом? 'console.log (concatCities)' дает уникальные города? –

+0

@nnnnnn Просто список без дубликатов. Думаю, у вас есть точка в указателях. Я думаю, что их сплайсинг является причиной моей проблемы. –

ответ

2

вы можете попробовать что-то вроде этого

var input = [ 
    { 
     name: "ACH2000", 
     year: 2005, 
     cities: ['Chicago', 'New York', 'Ames', 'Columbus'], 
     ages: [12, 32, 2, 51] 
    }, 
    { 
     name: "FXG3000", 
     year: 2008, 
     cities: ['Chicago', 'Joliet', 'Plymouth', 'Dallas'], 
     ages: [12, 32, 2, 51] 
    }, 
    { 
     name: "GTG1234", 
     year: 2012, 
     cities: ['Indy', 'Tampa', 'Houston', 'Dallas'], 
     ages: [12, 32, 2, 51] 
    } 
]; 

var citiesStats = {}; 

input.forEach(data => 
    data.cities.forEach(city => { 
     if (!citiesStats[city]) { 
      citiesStats[city] = 0; 
     } 
     ++citiesStats[city]; 
    }) 
); 

var cities = Object.keys(citiesStats); 

// ["Chicago", "New York", "Ames", "Columbus", "Joliet", "Plymouth", "Dallas", "Indy", "Tampa", "Houston"] 
console.log(cities); 
// {"Chicago":2,"New York":1,"Ames":1,"Columbus":1,"Joliet":1,"Plymouth":1,"Dallas":2,"Indy":1,"Tampa":1,"Houston":1} 
console.log(citiesStats); 
+0

Обратите внимание, что если все, о чем вы заботитесь, это окончательный список без дубликатов, тогда внутренний цикл может содержать только однострочный 'cityStats [city] = 0' (или = true или что-то еще - значение не имеет значения). – nnnnnn

1

Как nnnnnn предложил сплайсинг внутри цикла Мессинг индексы в массиве.

Если вы можете использовать Set, вот решение:

Array.from(new Set(concatCities)) 

Вот ссылка на fiddle.