Я думаю, что я собираюсь попробовать другой подход к этой проблеме. Я также думаю, что это будет быстрее, чем некоторые из предлагаемых решений (хотя нам, конечно, нужно будет протестировать его и сравнить его).
Прежде всего, почему бы нам не воспользоваться хэш-ориентированной природой массивов и объектов javascript? Мы могли бы создать объект, содержащий отношения (для создания своего рода карты) и сохранить в новом массиве те отношения, которые еще не были сохранены. При таком подходе нет проблем и с объектами, мы просто запрашиваем идентификатор или хэш или что-то еще для каждого объекта. Этот идентификатор должен сделать связь между ними возможной.
ОБНОВЛЕНИЕ
- Скрипт теперь контролирует возможность повторных элементов Fe [[а, Ь], [а, Ь]]
- Скрипт теперь контролирует возможность элементов с таким же объект повторяется f.е [[а, а], [а, а] [а, а]] вернется [а, а]
Код:
var temp = {},
massive_arr = [['a','b'],['a','c'],['a','d'], ['b','a'],['b','c'],['b','d'],['c','a'],['c','b'],['c','d']],
final_arr = [],
i = 0,
id1,
id2;
for(; i < massive_arr.length; i++) {
id0 = objectIdentifier(massive_arr[i][0]);// Identifier of first object
id1 = objectIdentifier(massive_arr[i][1]);// Identifier of second object
if(!temp[id0]) {// If the attribute doesn't exist in the temporary object, we create it.
temp[id0] = {};
temp[id0][id1] = 1;
} else {// if it exists, we add the new key.
temp[id0][id1] = 1;
}
if(id0 === id1 && !temp[id0][id1+"_bis"]) {// Especial case [a,a]
temp[id0][id1+"_bis"] = 1;
final_arr.push(massive_arr[i]);
continue;// Jump to next iteration
}
if (!temp[id1]) {// Store element and mark it as stored.
temp[id1] = {};
temp[id1][id0] = 1;
final_arr.push(massive_arr[i]);
continue;// Jump to next iteration
}
if (!temp[id1][id0]) {// Store element and mark it as stored.
temp[id1][id0] = 1;
final_arr.push(massive_arr[i]);
}
}
console.log(final_arr);
function objectIdentifier(obj) {
return obj;// You must return a valid identifier for the object. For instance, obj.id or obj.hashMap... whatever that identifies it unequivocally.
}
Вы можете проверить это here
ВТОРОЙ ОБНОВЛЕНИЕ
Хотя это не то, что было предложено в первую очередь, я изменил методику немного, чтобы адаптировать его к элементам п длины (п может изменяться при желании).
Этот метод работает медленнее из-за того, что он использует сортировку для создания действительного ключа для карты. Несмотря на это, я думаю, что это достаточно быстро.
var temp = {},
massive_arr = [
['a', 'a', 'a'], //0
['a', 'a', 'b'], //1
['a', 'b', 'a'],
['a', 'a', 'b'],
['a', 'c', 'b'], //2
['a', 'c', 'd'], //3
['b', 'b', 'c'], //4
['b', 'b', 'b'], //5
['b', 'b', 'b'],
['b', 'c', 'b'],
['b', 'c', 'd'], //6
['b', 'd', 'a'], //7
['c', 'd', 'b'],
['c', 'a', 'c'], //8
['c', 'c', 'a'],
['c', 'd', 'a', 'j'], // 9
['c', 'd', 'a', 'j', 'k'], // 10
['c', 'd', 'a', 'o'], //11
['c', 'd', 'a']
],
final_arr = [],
i = 0,
j,
ord,
key;
for (; i < massive_arr.length; i++) {
ord = [];
for (j = 0; j < massive_arr[i].length; j++) {
ord.push(objectIdentifier(massive_arr[i][j]));
}
ord.sort();
key = ord.toString();
if (!temp[key]) {
temp[key] = 1;
final_arr.push(massive_arr[i]);
}
}
console.log(final_arr);
function objectIdentifier(obj) {
return obj;
}
Это может быть проверено here
возможно дубликат [Удалить дубликаты из массива JavaScript] (http://stackoverflow.com/questions/9229645/remove-duplicates-from-javascript-array) - второй ответ здесь под заголовком «Unique By» должен помочь – Rhumborl
@Rhumborl нет, это не дубликат этого вопроса. Он не хочет удалять записи, которые появляются несколько раз, он просто хочет отфильтровать некоторые записи на основе описанных критериев. – Pointy
Не совсем ясно, какое значение имеет значение «a», «b» и т. Д., Повторяющееся в вашем примере. Все, что я могу сказать наверняка, это то, что вы не хотите кортежей, где первый элемент совпадает с вторым элементом. – Pointy