Чтобы получить симметричную разность , необходимо сравнить массивы обоими способами (или во всех случаях в случае нескольких массивов)
// 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));
}));
}
// 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);
}));
}
// 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}]
apt-get build-dep
- ваш друг - никто не может вспомнить все пакеты, необходимые для сборки чего-либо.
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 «на месте».
> > 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, будут по-прежнему сбиты с толку, когда они затем попробуют то же самое на других платформах.