2016-09-23 5 views
0

Я нашел вопросы, которые касаются вопроса, который у меня есть, но я еще не нашел решение, которое работает для меня. У меня есть этот массив: [[1, red], [2, green], [3, red], [3, blue], [5, green]], и мне нужно его вернуть [[1, red], [2, green], [3, blue]. Мне нужен код, который нужно сделать, - это пройти через массив и найти ТОЛЬКО цвета, которые соответствуют, а не числа, и избавиться от всего этого индекса.Удалить дубликаты из многомерного массива

Я пытался что-то вроде этого

var uniqueArray = colors.filter(function(item, pos) { 
return colors.indexOf(item) == pos; 
}); 

Я думаю, что этот код ищет полный матч, и я только потребовать частичного соответствия. Итак, в основном, как мне изменить .filter(), чтобы избавиться от частичных дубликатов (только для соответствия цветам)?

Пожалуйста, дайте мне знать, если мне нужно предоставить дополнительную информацию.

+0

Ваш вопрос немного запутанный. Зачем вам нужны «1», «2» и «3» в результате поиска? Могут ли они не определяться как 'answer.indexOf ('blue') + 1' или что-то подобное? – Julie

ответ

1
// Parameter marr: multidimensional array 
function removeSameColors(marr){ 
    var carr = []; 
    var rarr = []; 
    var j = -1; 

    for(var i = 0, l = marr.length; i < l; i++){ 
     if(carr[marr[i][1]] !== true){ 
      carr[marr[i][1]] = true; 
      rarr[++j] = marr[i]; 
     } 
    } 

    return rarr; 
} 

Это должно решить вашу проблему с очень малым временем выполнения.

1

Я хотел бы использовать for цикл для заполнения новый, уникальный массив:

var old_array = [[1, red], [2, green], [3, red], [3, blue], [5, green]], 
    old_count = old_array.length, 
    unique_array = [], check_array = [], i = 0; 

for(; i < old_count; i++) { 
    if (check_array.indexOf(old_array[i][1]) === -1) { 
     check_array.push(old_array[i][1]);// this array is filled with new colors, and used for checking 
     unique_array.push(old_array[i]); 
    } 
} 
+0

Я запустил это на скрипке, и выход был пустым массивом https://jsfiddle.net/sxrapxrv/1/ – Andrea

+0

Мои извинения, у меня была 1 ошибка, которую я не поймал. Я обновил свой код, и теперь он отлично работает ... см. Здесь скрипку ---> https://jsfiddle.net/sxrapxrv/2/ –

1

Вы можете использовать хэш-таблицу с цветом и использовать Array#filter для разыскиваемых предметов.

var data = [[1, 'red'], [2, 'green'], [3, 'red'], [3, 'blue'], [5, 'green']], 
 
    result = data.filter(function (a) { 
 
     if (!this[a[1]]) { 
 
      return this[a[1]] = true;      
 
     } 
 
    }, Object.create(null)); 
 

 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

0

Я бы просто отслеживал уникальные цвета в объекте, прошедшем в фильтр, потому что, как хэш, он будет уникальным. Если объект не имеет свойства по имени этого цвета, он возвращает его из фильтра. В противном случае, если он игнорирует элемент.

var colors = [[1, "red"], [2, "green"], [3, "red"], [3, "blue"], [5, "green"]]; 

var uniqueArray = colors.filter(function(item, pos) { 
    if (!this.hasOwnProperty(item[1])) { 
     return this[item[1]] = true; 
    } 
    return false; 
}, {}); 

Это дает вам uniqueArray = [[1,"red"],[2,"green"],[3,"blue"]], как и ожидалось.

Смежные вопросы