You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
48 lines
930 B
48 lines
930 B
'use strict';
|
|
|
|
var filter = require('through2-filter').obj;
|
|
var stringify = require("json-stable-stringify-without-jsonify");
|
|
|
|
var ES6Set;
|
|
if (typeof global.Set === 'function') {
|
|
ES6Set = global.Set;
|
|
} else {
|
|
ES6Set = function() {
|
|
this.keys = [];
|
|
this.has = function(val) {
|
|
return this.keys.indexOf(val) !== -1;
|
|
},
|
|
this.add = function(val) {
|
|
this.keys.push(val);
|
|
}
|
|
}
|
|
}
|
|
|
|
function prop(propName) {
|
|
return function (data) {
|
|
return data[propName];
|
|
};
|
|
}
|
|
|
|
module.exports = unique;
|
|
function unique(propName, keyStore) {
|
|
keyStore = keyStore || new ES6Set();
|
|
|
|
var keyfn = stringify;
|
|
if (typeof propName === 'string') {
|
|
keyfn = prop(propName);
|
|
} else if (typeof propName === 'function') {
|
|
keyfn = propName;
|
|
}
|
|
|
|
return filter(function (data) {
|
|
var key = keyfn(data);
|
|
|
|
if (keyStore.has(key)) {
|
|
return false;
|
|
}
|
|
|
|
keyStore.add(key);
|
|
return true;
|
|
});
|
|
}
|
|
|