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.
 
 
 

100 lines
2.6 KiB

'use strict';
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
var nestedValue = require('../helpers/nestedValue');
var buildKeyPathMap = function buildKeyPathMap(items) {
var keyPaths = {};
items.forEach(function (item, index) {
function buildKeyPath(val, keyPath) {
if ((typeof val === 'undefined' ? 'undefined' : _typeof(val)) === 'object') {
Object.keys(val).forEach(function (prop) {
buildKeyPath(val[prop], keyPath + '.' + prop);
});
}
keyPaths[keyPath] = val;
}
buildKeyPath(item, index);
});
return keyPaths;
};
module.exports = function pluck(value, key) {
if (value.indexOf('*') !== -1) {
var keyPathMap = buildKeyPathMap(this.items);
var keyMatches = [];
if (key !== undefined) {
var keyRegex = new RegExp('0.' + key, 'g');
var keyNumberOfLevels = ('0.' + key).split('.').length;
Object.keys(keyPathMap).forEach(function (k) {
var matchingKey = k.match(keyRegex);
if (matchingKey) {
var match = matchingKey[0];
if (match.split('.').length === keyNumberOfLevels) {
keyMatches.push(keyPathMap[match]);
}
}
});
}
var valueMatches = [];
var valueRegex = new RegExp('0.' + value, 'g');
var valueNumberOfLevels = ('0.' + value).split('.').length;
Object.keys(keyPathMap).forEach(function (k) {
var matchingValue = k.match(valueRegex);
if (matchingValue) {
var match = matchingValue[0];
if (match.split('.').length === valueNumberOfLevels) {
valueMatches.push(keyPathMap[match]);
}
}
});
if (key !== undefined) {
var collection = {};
this.items.forEach(function (item, index) {
collection[keyMatches[index] || ''] = valueMatches;
});
return new this.constructor(collection);
}
return new this.constructor([valueMatches]);
}
if (key !== undefined) {
var _collection = {};
this.items.forEach(function (item) {
if (nestedValue(item, value) !== undefined) {
_collection[item[key] || ''] = nestedValue(item, value);
} else {
_collection[item[key] || ''] = null;
}
});
return new this.constructor(_collection);
}
return this.map(function (item) {
if (nestedValue(item, value) !== undefined) {
return nestedValue(item, value);
}
return null;
});
};