106 lines
2.5 KiB
JavaScript
106 lines
2.5 KiB
JavaScript
|
'use strict';
|
||
|
|
||
|
var _require = require('../helpers/is'),
|
||
|
isArray = _require.isArray,
|
||
|
isObject = _require.isObject;
|
||
|
|
||
|
var nestedValue = require('../helpers/nestedValue');
|
||
|
|
||
|
var buildKeyPathMap = function buildKeyPathMap(items) {
|
||
|
var keyPaths = {};
|
||
|
|
||
|
items.forEach(function (item, index) {
|
||
|
function buildKeyPath(val, keyPath) {
|
||
|
if (isObject(val)) {
|
||
|
Object.keys(val).forEach(function (prop) {
|
||
|
buildKeyPath(val[prop], keyPath + '.' + prop);
|
||
|
});
|
||
|
} else if (isArray(val)) {
|
||
|
val.forEach(function (v, i) {
|
||
|
buildKeyPath(v, keyPath + '.' + i);
|
||
|
});
|
||
|
}
|
||
|
|
||
|
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;
|
||
|
});
|
||
|
};
|