Найти разницу между двумя массивами с учетом дубликатов [дубликат]

Другое решение состоит в том, чтобы выполнить код через последовательный исполнитель nsynjs .

Если базовая функция многозначна

nsynjs будет последовательно оценивать все обещания и ставить обещания результат в свойство data:

function synchronousCode() {

    var getURL = function(url) {
        return window.fetch(url).data.text().data;
    };
    
    var url = 'https://ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js';
    console.log('received bytes:',getURL(url).length);
    
};

nsynjs.run(synchronousCode,{},function(){
    console.log('synchronousCode done');
});

Если базовая функция не обещает

Шаг 1. Wrap с обратным вызовом в оболочку, совместимую с nsynjs (если у нее есть обещанная версия, вы можете пропустить этот тест):

var ajaxGet = function (ctx,url) {
    var res = {};
    var ex;
    $.ajax(url)
    .done(function (data) {
        res.data = data;
    })
    .fail(function(e) {
        ex = e;
    })
    .always(function() {
        ctx.resume(ex);
    });
    return res;
};
ajaxGet.nsynjsHasCallback = true;

Шаг 2. Вставить синхронную логику в функцию:

function process() {
    console.log('got data:', ajaxGet(nsynjsCtx, "data/file1.json").data);
}

Шаг 3. Выполнить функцию синхронно через nnsynjs:

nsynjs.run(process,this,function () {
    console.log("synchronous function finished");
});

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

Дополнительные примеры здесь: https://github.com/amaksr/nsynjs/tree/master/examples

4
задан osman 25 May 2015 в 00:07
поделиться

2 ответа

EDIT: Как предложено user2864740 в комментариях к вопросу, использование Array # slice! является гораздо более изящным решением

def arr_sub(a,b)
    a = a.dup #if you want to preserve the original array
    b.each {|del| a.slice!(a.index(del)) if a.include?(del) }
    return a
end

Кредит:

Мой первоначальный ответ

def arr_sub(a,b)
    b = b.each_with_object(Hash.new(0)){ |v,h| h[v] += 1 }

    a = a.each_with_object([]) do |v, arr| 
        arr << v if b[v] < 1
        b[v] -= 1
    end
end

arr_sub([1,2,3,3],[1,2,3]) # a => [3]
arr_sub([1,2,3,3,4,4,4],[1,2,3,4,4]) # => [3, 4]
arr_sub([4,4,4,5,5,5,5],[4,4,5,5,5,5,6,6]) # => [4]
3
ответ дан Community 25 August 2018 в 10:53
поделиться

Насколько я знаю, вы не можете сделать это со встроенной операцией. Не вижу ничего в ruby ​​docs . Самый простой способ сделать это - расширить класс массива следующим образом:

class Array
    def difference(array2)
        final_array = []
        self.each do |item|
            if array2.include?(item)
                array2.delete_at(array2.find_index(item))
            else
                final_array << item
            end
        end
    end
end

Насколько мне известно, есть более эффективный способ сделать это, также

1
ответ дан Ben Muschol 25 August 2018 в 10:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: