Javascript-форум (https://javascript.ru/forum/)
-   Оффтопик (https://javascript.ru/forum/offtopic/)
-   -   Как найти различие между двумя массивами? (https://javascript.ru/forum/offtopic/43511-kak-najjti-razlichie-mezhdu-dvumya-massivami.html)

cyber 10.12.2013 00:30

бля, где я накосячил
http://learn.javascript.ru/play/yKRwuc

Maxmaxmaximus4 10.12.2013 00:31

cyber, консоль закрой когда тесты делаешь)
а еще у меня реплейсов нет, подразумевается что ВСЕ реплейсы) ну для ui это сделать дешево получается, очень дешево.



вот моя функция, работает ядерно быстро

function compare(oArr, arr) {
  var nArr = arr.slice();
  var insert = []
  var remove = []


  for (var i = 0, index; i < oArr.length; i++) {
    index = nArr.indexOf(oArr[i]);
    if (index < 0) remove.push(i);
    else nArr[index] = void 0;
  }

  for (var i = 0; i < nArr.length; i++) {
    if (nArr[i] === void 0) continue;
    var index = remove.indexOf(i);
    if (index < 0) insert.push(i);
    else remove.splice(index, 1);
  }

  return {
    insert: insert,
    remove: remove
  }
}

cyber 10.12.2013 00:33

Maxmaxmaximus4,
ты можешь еще компактней писать? (сарказм)

Нахрена void 0; почему просто нельзя написать undefined?

Maxmaxmaximus4 10.12.2013 00:36

Цитата:

Сообщение от cyber
почему просто нельзя написать undefined?

потому что я читаю как "ничтожный ноль" то есть полное ничего, а undefined это переменная, я боюсь её) вдруг там что лежит


Цитата:

Сообщение от cyber
ты можешь еще компактней писать? (сарказм)

когда я был маленький я писал как ты, теперь я понял что такой стиль лучше, у меня между функциями расстояние в 3 строки. в функциях в некоторых ВАЖНЫХ местах одна строка. и она не теряет ценность так как встречется редко и бросается в глаза. я осознанно решил использовать этот стиль и хотя он был мне и не привычный я решил его попробовать и он оказался крутой)

cyber 10.12.2013 00:38

Maxmaxmaximus4, нет , я реально индус, у меня ошибка не в новой функции а в старой)

cyber 10.12.2013 00:40

ну вот чем я думал когда писал такую проверку
search.forEach(function (elem, i) {      
        if(elem)
          insert.push(i);  
     
 });

Maxmaxmaximus4 10.12.2013 00:43

Цитата:

Сообщение от cyber
ну вот чем я думал когда писал такую проверку

ты удалял ключи делитом и думал что теперь в за место удаленных ключей будет undefined и проверял на него =) игнорируя что ты даже не ключь проверяешь, а значение) все просто

cyber 10.12.2013 00:43

Цитата:

Сообщение от Maxmaxmaximus4
когда я был маленький я писал как ты

эм, т.е большинство javascript библиотек, фреймворков пишут "маленькие" ?

cyber 10.12.2013 00:44

Цитата:

Сообщение от Maxmaxmaximus4
ты удалял ключи делитом и думал что теперь в за место удаленных ключей будет undefined и проверял на него =) игнорируя что ты даже не ключь проверяешь) все просто

вопрос был реторический))

Maxmaxmaximus4 10.12.2013 00:44

Цитата:

Сообщение от cyber
эм, т.е большинство javascript библиотек, фреймворков пишут "маленькие" ?

нет, я имел ввиду раньше я тоже писал как ты =) не бомби

cyber 10.12.2013 00:46

Maxmaxmaximus4, живой пример http://code.jquery.com/jquery-1.10.2.js

cyber 10.12.2013 00:51

Poznakomlus, кстати разница есть, но не особо существенная покрайней мере в хроме.

Maxmaxmaximus4 10.12.2013 01:00

Цитата:

Сообщение от Poznakomlus
в каждом цикле сколько раз длину массива вычисляем?

длинна при итерации, да и вообще обращения к свойствам кэшируются вообще-то.

Цитата:

Сообщение от Poznakomlus
и зачем дважды i объявлять

на всякий случай, вдруг буду менять код и уберу один цикл, а второй работать перестанет.
а есть какие-то причины этого не делать?

Цитата:

Сообщение от cyber

ну и , они пишут как я, у них пустые строки строго в нужных местах а у тебя везде. именно их стайл и стайл Three.js я и перенял

cyber 10.12.2013 01:04

Цитата:

Сообщение от Poznakomlus
верен в этом, у меня сложилось убеждение, что это обертка for

нет, я все же ошибся.

cyber 10.12.2013 01:04

Poznakomlus, а вот forEach нужно убрать нафиг

Maxmaxmaximus4 10.12.2013 01:06

Цитата:

Сообщение от cyber
а вот forEach нужно убрать нафиг

конечно)) вызов функции дорогая штука, создается контекст замыкания скоупы и прочее) я же не спроста заменил циклом.

cyber 10.12.2013 01:07

Цитата:

Сообщение от cyber
Poznakomlus, а вот forEach нужно убрать нафиг

хотя странно, я его убрал нечего не изменилось, а на другом примере он самый тормознутый

cyber 10.12.2013 01:08

Maxmaxmaximus4, эм, с forEach в среднем на 10 милесекунд быстрее О_О

cyber 10.12.2013 01:10

попробуй ты, а то я что то уже нехрена не пойму.
function compare(fArr,arr) {
    
    var search = arr.slice(),
        insert = [],
        remove = [],
        replace = [],
        leng = fArr.length;
    
    for(var i = 0, index; i < leng; i++) {
        
      if(fArr[i] === arr[i]){
        
      search[i] = undefined;
       continue;
      }
        
          
        index = search.indexOf(fArr[i]);

        if(!~index) {
          
            remove.push(i);
            continue;
        }
        
       i != index && replace.push({old: i, new: index});
        
         search[index] = undefined;

        };
  
    
    for(i = 0, leng = search.length; i < leng; i++ ) {
        if(search[i] !== undefined)
          insert.push(i);     
    };
    
    return {
        remove: remove,
        insert: insert,
        replace: replace
    }
    
}


function compare(fArr,arr) {
    
    var search = arr.slice(),
        insert = [],
        remove = [],
        replace = [],
        leng = fArr.length;
    
    for(var i = 0, index; i < leng; i++) {
        
      if(fArr[i] === arr[i]){
        
      search[i] = undefined;
       continue;
      }
        
          
        index = search.indexOf(fArr[i]);

        if(!~index) {
          
            remove.push(i);
            continue;
        }
        
       i != index && replace.push({old: i, new: index});
        
         search[index] = undefined;

        };
  
    
    search.forEach(function (elem, i) {
        if(elem !== undefined)
          insert.push(i);     
    });
    
    return {
        remove: remove,
        insert: insert,
        replace: replace
    }
    
}

Maxmaxmaximus4 10.12.2013 01:10

cyber, да мазафака, эти оптимизации хромовские не поймешь)


у меня кстати второй цикл вот такой, я исключаю лишние перемещения которые можно заменить реплейсами

for (var i = 0; i < nArr.length; i++) {
    if (nArr[i] === void 0) continue;
    var index = remove.indexOf(i);
    if (index < 0) insert.push(i);
    else remove.splice(index, 1);
  }

Maxmaxmaximus4 10.12.2013 01:15

Poznakomlus, из какого еще примера? куда перенял? ты вообще о чем? я говорю свойство длинны кэшируется и не вычисляется каждый раз, оно движком кэшируется, что непонятного?

cyber 10.12.2013 01:20

Цитата:

Сообщение от Maxmaxmaximus4
да мазафака, эти оптимизации хромовские не поймешь)

У меня даже ИЕ forEach быстрей обрабатывает))
П.с эти мудаки нормальную консоль сделали О_О

Maxmaxmaximus4 10.12.2013 01:22

Цитата:

Сообщение от cyber
П.с эти мудаки нормальную консоль сделали О_О

ахахаха дадаададада у всех такая реакция)

Цитата:

Сообщение от cyber
У меня даже ИЕ forEach быстрей обрабатывает))

на много?

Maxmaxmaximus4 10.12.2013 01:27

Цитата:

Сообщение от cyber
У меня даже ИЕ forEach быстрей обрабатывает))

у меня разницы нет, но оставлю так потому что красивее:

function compare(oArr, arr) {
  var nArr = arr.slice();
  var insert = []
  var remove = []

  oArr.forEach(function(val, i) {
    var index = nArr.indexOf(val);
    if (index < 0) remove.push(i);
    else nArr[index] = void 0;
  });

  nArr.forEach(function(val, i) {
    if (val === void 0) return;
    var index = remove.indexOf(i);
    if (index < 0) insert.push(i);
    else remove.splice(index, 1);
  });

  return {
    insert: insert,
    remove: remove
  }
}

cyber 10.12.2013 01:29

мозила тормоз еще тот...

мозила


ие

хром

Maxmaxmaximus4 10.12.2013 01:30

cyber, чувак, ты чо не умеешь среднее арифметическое вычислять)?

cyber 10.12.2013 01:32

Maxmaxmaximus4, зачем?)
Если серьезно то у меня есть функция для сравнения скорости, но мне влом что то делать уже кроме как нажимать кнопку "просмотр"

Maxmaxmaximus4 10.12.2013 01:47

Цитата:

Сообщение от cyber
splice не вырезает элементы

на чем основано это утверждение?

по поводу форов, for быстрее

function test(callback, cnt) {
    var time = 0;
    var i = 100;
    while (i--) {
      var j = cnt;
      var start = Date.now();
      while (j--) callback();
      time += Date.now() - start
    }
    return time / 100;
  }

  var array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
  var time = test(function() {
    for (var i = 0; i < array.length; i++) {
      array[i] = array.length[i];
    }
  }, 10000)

  var time2 = test(function() {
    array.forEach(function(val, i) {
      array[i] = val
    })
  }, 10000)

  alert('for ' + time + 'ms');
  alert('forEach ' + time2 + 'ms');

cyber 10.12.2013 01:51

Maxmaxmaximus4, у меня разницы в скорости нет))

Maxmaxmaximus4 10.12.2013 01:52

Цитата:

Сообщение от cyber
у меня разницы в скорости нет))

ну у меня тоже, но бывает что ЕСЛИ И ЕСТЬ то выигрывает for, то есть ни разу не было чтобы разница БЫЛА а выиграл forEach

cyber 10.12.2013 01:53

Цитата:

Сообщение от Maxmaxmaximus4
на чем основано это утверждение?

на том что я перепутал slice и splice.
И вообще уже давно пора валить спать)

Maxmaxmaximus4 10.12.2013 01:58

У меня вот тут другая дилемма, я думаю как сделать анимацию появления и исчезнавения, но при том чтобы она была вся на css и при том чтобы мой скрипт после анимации удаления понмиал что анимация кончилась и удалял блок.

cyber 10.12.2013 02:03

Maxmaxmaximus4,
http://learn.javascript.ru/css-anima...-transitionend

Maxmaxmaximus4 10.12.2013 02:07

cyber, ты не пони, человек будет писать .. короче.

если у элемента на котором нужна анимация висит атрибут animate то всё что может давать анимацию - дает ему анимацию. как? добавлением классов .fade .show .remove и.т.п. и человек у себя в css оформляет эти классы такими какими он хочет видеть состояние элемента во время этого действия. и там он может сделать чо то типа transition = 1s;

короче я думаю.

Maxmaxmaximus4 10.12.2013 02:10

хм, есть другой вариантик ^_^, ща замутим

Maxmaxmaximus4 10.12.2013 03:32

Цитата:

Сообщение от Poznakomlus
быстрее обращаться напрямую к переменной

на чем основано это утверждение? ладно не буду томить, нет не быстрее, так как свойства кэшируются движком. мне это наверное в этом топике придется раз 10 повторить...

Maxmaxmaximus4 10.12.2013 03:56

а мне норм

<script src='//mychamber.ru/build/ui.js'></script>


<style>
     body {padding: 40px; overflow-y : scroll;  -webkit-user-select : none}

    .list-item {
      border           : 1px solid black;
      overflow         : hidden;
      height           : 20px;
      transition       : 0.3s;
      background-color : #bfc7ff;
    }

    .list-item.add {
      height            : 0;
      -webkit-transform : scale(1.1, 4);
      opacity           : 0;
      background-color  : greenyellow;
    }

    .list-item.remove {
      background-color : red;
      opacity          : 0;
      height           : 0;
    }

    .list-item.change {
      opacity          : 0.8;
      background-color : #bbdeff;
    }
</style>


<div controller="Chat">

  <button click="unshift()">unshift</button>
  <button click="shift()">shift</button>
  <button click="insert()">insert</button>
  <button click="change()">change</button>
  <button click="reverse()">reverse</button>

  <ul>
    <li click="remove($index)" class="list-item" repeat="item in items">
      {item.text}
    </li>
  </ul>

</div>


<script>
function Chat() {

    items = [
      {text: '21'},
      {text: '242'}
    ]

    unshift = function() { items.unshift({text: Math.random()}) }
    shift = function() { items.shift() }
    insert = function() { items.splice(2, 0, {text: 12312123}) }
    remove = function(index) { items.splice(index, 1) }
    change = function() { items[2] = {text: Math.random()} }
    reverse = function() { items = items.reverse() }

}
</script>

Maxmaxmaximus4 10.12.2013 06:02

осталось доделать сервис $http и пару директив запилить. и можно выпускать 1.0.0 ^_____________________^
а, ну и утечки пофиксить.

cyber 10.12.2013 10:47

Maxmaxmaximus4,
Не понял
Цитата:

Сообщение от Maxmaxmaximus4
а можем развернуть в инстанс

можешь пример показать?

Maxmaxmaximus4 10.12.2013 14:31

<script src='//mychamber.ru/build/ui.js'></script>

<div controller="User">
  Привет {name}, тебе {age} лет!
</div>

<div controller="User as user">
  Привет {user.name}, тебе {user.age} лет!
</div>

<script>
  function User() {
    name = 'Ашот'
    age = 15
  }
</script>


Часовой пояс GMT +3, время: 08:29.