Почему я не могу создать “привет мир” для бойкого?

Чтобы получить симметричную разность , необходимо сравнить массивы обоими способами (или во всех случаях в случае нескольких массивов)

enter image description here

ES7 (ECMAScript 2016)

// diff between just two arrays:
function arrayDiff(a, b) {
    return [
        ...a.filter(x => !b.includes(x)),
        ...b.filter(x => !a.includes(x))
    ];
}

// diff between multiple arrays:
function arrayDiff(...arrays) {
    return [].concat(...arrays.map( (arr, i) => {
        const others = arrays.slice(0);
        others.splice(i, 1);
        const unique = [...new Set([].concat(...others))];
        return arr.filter(x => !unique.includes(x));
    }));
}

ES6 (ECMAScript 2015)

// diff between just two arrays:
function arrayDiff(a, b) {
    return [
        ...a.filter(x => b.indexOf(x) === -1),
        ...b.filter(x => a.indexOf(x) === -1)
    ];
}

// diff between multiple arrays:
function arrayDiff(...arrays) {
    return [].concat(...arrays.map( (arr, i) => {
        const others = arrays.slice(0);
        others.splice(i, 1);
        const unique = [...new Set([].concat(...others))];
        return arr.filter(x => unique.indexOf(x) === -1);
    }));
}

ES5 (ECMAScript 5.1 )

// diff between just two arrays:
function arrayDiff(a, b) {
    var arrays = Array.prototype.slice.call(arguments);
    var diff = [];

    arrays.forEach(function(arr, i) {
        var other = i === 1 ? a : b;
        arr.forEach(function(x) {
            if (other.indexOf(x) === -1) {
                diff.push(x);
            }
        });
    })

    return diff;
}

// diff between multiple arrays:
function arrayDiff() {
    var arrays = Array.prototype.slice.call(arguments);
    var diff = [];

    arrays.forEach(function(arr, i) {
        var others = arrays.slice(0);
        others.splice(i, 1);
        var otherValues = Array.prototype.concat.apply([], others);
        var unique = otherValues.filter(function (x, j) { 
            return otherValues.indexOf(x) === j; 
        });
        diff = diff.concat(arr.filter(x => unique.indexOf(x) === -1));
    });
    return diff;
}

Пример:

// diff between two arrays:
const a = ['a', 'd', 'e'];
const b = ['a', 'b', 'c', 'd'];
arrayDiff(a, b); // (3) ["e", "b", "c"]

// diff between multiple arrays
const a = ['b', 'c', 'd', 'e', 'g'];
const b = ['a', 'b'];
const c = ['a', 'e', 'f'];
arrayDiff(a, b, c); // (4) ["c", "d", "g", "f"]

Разница между массивами объектов

function arrayDiffByKey(key, ...arrays) {
    return [].concat(...arrays.map( (arr, i) => {
        const others = arrays.slice(0);
        others.splice(i, 1);
        const unique = [...new Set([].concat(...others))];
        return arr.filter( x =>
            !unique.some(y => x[key] === y[key])
        );
    }));
}

Пример:

const a = [{k:1}, {k:2}, {k:3}];
const b = [{k:1}, {k:4}, {k:5}, {k:6}];
const c = [{k:3}, {k:5}, {k:7}];
arrayDiffByKey('k', a, b, c); // (4) [{k:2}, {k:4}, {k:6}, {k:7}]

44
задан usr1234567 2 April 2016 в 06:52
поделиться

3 ответа

apt-get build-dep - ваш друг - никто не может вспомнить все пакеты, необходимые для сборки чего-либо.

-3
ответ дан 26 November 2019 в 21:57
поделиться

glib имеет тенденцию скрывать себя ... Ваш оператор include не работает, потому что GCC не выполняет автоматический поиск подкаталогов и поэтому не может видеть glib.h в glib-1.2 или glib-2.0 .

Прочтите страницу Компиляция приложений GLib в руководствах по GLIB ... вы используете такие команды, как pkg-config --cflags glib-2.0 , чтобы получить правильные флаги для GCC.

Канонический способ сделать то, что вы пытаетесь, - это

% gcc test.c -Wall -o test `pkg-config --cflags --libs glib-2.0`

Обратите внимание на обратные галочки, которые говорят оболочке выполнить команду pkg-config «на месте».

52
ответ дан 26 November 2019 в 21:57
поделиться
> > The canonical way to do what you are trying is

> % gcc test.c -Wall -o test `pkg-config --cflags --libs glib-2.0`

Извините, но нет. Это распространенное заблуждение, которое в большинстве случаев работает в системах на основе ELF, в частности в Linux. Канонический способ - передать cflags и библиотеки отдельно, в правильных и традиционных местах в командной строке, например:

gcc -Wall -o test `pkg-config --cflags glib-2.0` test.c `pkg-config --libs glib-2.0`

Жалко, что pkg-config принимает параметры --cflags и --libs в в то же время, поскольку это означает, что этот неправильный мем никогда не умрет, и люди, привыкшие к нему в Linux, будут по-прежнему сбиты с толку, когда они затем попробуют то же самое на других платформах.

40
ответ дан 26 November 2019 в 21:57
поделиться
Другие вопросы по тегам:

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