Удалить и вернуть массив из удаленных элементов splice
Тут такой вопрос. Мне нужно удалить повторяющиеся элементы из массива и вывести массив из удаленных элементов в браузер. Получается что-то одно. Параллельно не получается.
Тут функция возвращает удаленные элементы function Dublicates(array) { var dubl = []; for (var i = 0; i < array.length; i++) { for (var j = i + 1; j < array.length; j++) { if (array[i][0] == array[j][0]) { // search for the same account numbers dubl = array.splice(j, 1); //массив из удаленных элементов }; }; }; return dubl; // возвращает массив из удаленных элементов } А если пишу так то удаляет элементы из массива function Dublicates(array) { var dubl = []; for (var i = 0; i < array.length; i++) { for (var j = i + 1; j < array.length; j++) { if (array[i][0] == array[j][0]) { // search for the same account numbers array.splice(j, 1); //удаляет }; }; }; return array; // удаляет } Никак понять не могу как лучше сделать эти два действия в функции. Подскажите пожалуйста:) |
А что нужно получить в результате: массив без дублей или массив, состоящий из дублей исходного?
|
Demath,
Есть массив аrray. Надо найти в колонке (array[i][0]) одинаковые элементы(дубли). Если таковы есть, их надо удалить из массива array(т.е. получить массив без дублей) И список удаленных вывести в браузер. т.е. Надо получить массив состоящий из дублей исходного. |
Много вариантов было.
Один из них.. функция удаляет из исходного массива дубли. Вторая соответственно уже не может найти дубли.. Т.е. непонятно как его сделать.. |
Цитата:
2. Могут ли повторяющиеся элементы встречаться более одного раза? 3. В случае, например, array = [[15,2,-5],[1,2,4],[15,0,1],[15,11,5]], что должна вернуть функция? |
Вложений: 1
Цитата:
Более одного раза - нет. Ну а по поводу третьего вопроса то вернет в консоле то что прикрепленном файле |
В первам случае он также удаляет элементы из массива как и во втором, функция возвращает массив удалённых элементов, при этом изначальный array изменяется.
|
array не меняется в первом случае..
|
А я говорю - меняется:
array = [[15,2,-5],[1,2,4],[15,0,1],[15,11,5]] function Dublicates(array) { var dubl = []; for (var i = 0; i < array.length; i++) { for (var j = i + 1; j < array.length; j++) { if (array[i][0] == array[j][0]) { // search for the same account numbers dubl = array.splice(j, 1); //массив из удаленных элементов }; }; }; return dubl; // возвращает массив из удаленных элементов } alert(array) alert( Dublicates(array) ) alert(array) Читаем про то, как работает splice. |
Просто когда я вызываю эту функцию для array то она конечно удаляет. Но когда я хочу вывести удаленные в браузер то вот тут не получается..
|
Paulyyy, так нужно?
<script type="text/javascript"> function Dublicates(A) { var N=A.length, B=[], k=0; for (var i=0; i<N-1; i++) { for (var j=i+1; j<N; j++) { if (A[i][0] == A[j][0] && A[j] != 'marker') { B[B.length] = A[j]; A[j] = 'marker'; } } } for (var i=0; i<N; i++) { if (A[i] != 'marker') A[k++] = A[i]; } A.length = k; return 'Дубли (по 1-м элементам строк) исходного массива\n'+B.join('\n') +'\n\nИсходный массив без дублей\n(порядок следование строк сохранён)' +'\n'+A.join('\n'); } </script> <input value="Пример Arr=[[15,2,-5],[1,2,4],[1,0,1],[2,1,5],[15,11,5],[2,2,5]]" type="button" onclick="alert( Dublicates([[15,2,-5],[1,2,4],[1,0,1],[2,1,5],[15,11,5],[2,2,5]]) )" /> |
Demath
Не могу сказать что сильно помогло, но все равно спасибо!!:) буду разбираться.. Один вопросик, что тут означает marker? |
Aetae,
Помните вы мне помогли с csv файлом..http://javascript.ru/forum/misc/3768...t-kolonku.html , за что спасибо!! я вызываю функцию Dublicates в строке text.value = arrayToCSV(table, Dublicates(table)); для того чтобы в загружаемом файле изначально удалились дубли. Также мне надо вывести текстом удаленные дубли text.value += ....; Соответственно дубли уже не выводятся. Вообще было много вариантов, этот один из них. Может вы поймете как его лучше сделать... |
Цитата:
Цитата:
|
Посмотрите как работает. Туда надо загрузить файл типа csv чтобы посмотреть что возвращает функция. Конечно же чтобы были дубли по 1 колонке в файле
<!DOCTYPE HTML> <html lang="ru-RU"> <head> <meta charset="UTF-8"> <title></title> <style type="text/css"> *{margin:0;padding:0} html, body{ width: 100%; height: 100%; } html, body, textarea, input{ font: 20px serif; background-color: #220; color: #ddf; } textarea{width: 100%; height: 90%; border: none; } </style> <script type="text/javascript"> function read(files) { //read files var i = files.length, reader = new FileReader(); reader.onload = function () { example(reader.result); }; reader.readAsText(files[--i]); } function arrayFromCSV(csv) { var lines = csv.split(/[\r\n]+/), i = lines.length, //split on strings array = new Array(); // create an array lines.forEach(function (el, i, lines) { if (i > 0) { array.push(el.split(',')); //split by commas, and fill an array }; }); return array; } function arrayToCSV(array) { var csv = ''; for (var i = 0, l = array.length; i < l; i++) { csv += (array[i] && array[i].join(',') || '') + '\r\n'; }; return csv; } function id(i) { return document.getElementById(i); } function example(csv) { var table = arrayFromCSV(csv), text = id('textarea'); text.value = arrayToCSV(table); function Dublicates(array) { var dubl = []; for (var i = 0, l = array.length - 1; i < l; i++) { for (var j = i + 1; j < array.length; j++) { if (array[i][0] == array[j][0] && array[j] != 'marker') { // search for the same account numbers dubl = array.splice(j, 1); }; }; }; return dubl; } text.value += '===== Noted Dublicates Account Numbers =====\n' + arrayToCSV(Dublicates(table)); |
Все, нашла решение :) . Так что всем спасибо)
|
Часовой пояс GMT +3, время: 16:32. |