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; |
|
}); |
|
}
|
|
|