Карта над ключами сохранения объектов
The map
функция подчеркивания.js, если он вызывается с помощью объекта javascript, возвращает массив значений, отображенных из значений объекта.
_.map({one: 1, two: 2, three: 3}, function(num, key){ return num * 3; });
=> [3, 6, 9]
есть ли способ сделать его сохранить ключи? т. е., я хочу функцию, которая возвращает
{one: 3, two: 6, three: 9}
10 ответов:
С подчеркивание
подчеркивание обеспечивает функцию
_.mapObject
для отображения значений и сохранения ключей._.mapObject({ one: 1, two: 2, three: 3 }, function (v) { return v * 3; }); // => { one: 3, two: 6, three: 9 }
С Лодашь
Lodash предоставляет функцию
_.mapValues
для отображения значений и сохранения ключи._.mapValues({ one: 1, two: 2, three: 3 }, function (v) { return v * 3; }); // => { one: 3, two: 6, three: 9 }
мне удалось найти нужную функцию в lodash, служебной библиотеке, похожей на underscore.
http://lodash.com/docs#mapValues
_.mapValues(object, [callback=identity], [thisArg])
создает объект с теми же ключами, что и объект и значения, созданные запуск каждого собственного перечисляемого свойства объекта через обратный вызов. Обратный вызов привязан к thisArg и вызывается с тремя аргументами; (значение, ключ, объект).
var mapped = _.reduce({ one: 1, two: 2, three: 3 }, function(obj, val, key) { obj[key] = val*3; return obj; }, {}); console.log(mapped);
<script src="http://underscorejs.org/underscore-min.js"></script> <script src="https://getfirebug.com/firebug-lite-debug.js"></script>
Я знаю, что это старый, но теперь подчеркивание имеет новую карту для объектов:
_.mapObject(object, iteratee, [context])
вы можете, конечно, построить гибкую карту для массивов и объектов
_.fmap = function(arrayOrObject, fn, context){ if(this.isArray(arrayOrObject)) return _.map(arrayOrObject, fn, context); else return _.mapObject(arrayOrObject, fn, context); }
как насчет этой версии в простой JS (ES6 / ES2015)?
let newObj = Object.assign(...Object.keys(obj).map(k => ({[k]: obj[k] * 3})));
если вы хотите сопоставить объект рекурсивно (map nested obj), это можно сделать так:
const mapObjRecursive = (obj) => { Object.keys(obj).forEach(key => { if (typeof obj[key] === 'object') obj[key] = mapObjRecursive(obj[key]); else obj[key] = obj[key] * 3; }); return obj; };
С ES7 / ES2016 можно использовать
Object.entries
вместоObject.keys
такой:let newObj = Object.assign(...Object.entries(obj).map([k, v] => ({[k]: v * 3})));
_.карта возвращает массив, а не объект.
Если вы хотите объект, вам лучше использовать другую функцию, например
each
; Если вы действительно хотите использовать карту, вы могли бы сделать что-то вроде этого:Object.keys(object).map(function(value, index) { object[value] *= 3; })
но это сбивает с толку, когда вижу
map
можно было бы ожидать, чтобы иметь массив в результате, а затем сделать что-то с ним.
Я думаю, что вы хотите mapValues функция (для отображения функции по значениям объекта), которую достаточно легко реализовать самостоятельно:
mapValues = function(obj, f) { var k, result, v; result = {}; for (k in obj) { v = obj[k]; result[k] = f(v); } return result; };
Я знаю, что это было давно, но все же самое очевидное решение через fold (aka reduce in js) отсутствует, для полноты я оставлю его здесь:
function mapO(f, o) { return Object.keys(o).reduce((acc, key) => { acc[key] = f(o[key]) return acc }, {}) }
смесь исправление для подчеркивания карте ошибка: P
_.mixin({ mapobj : function( obj, iteratee, context ) { if (obj == null) return []; iteratee = _.iteratee(iteratee, context); var keys = obj.length !== +obj.length && _.keys(obj), length = (keys || obj).length, results = {}, currentKey; for (var index = 0; index < length; index++) { currentKey = keys ? keys[index] : index; results[currentKey] = iteratee(obj[currentKey], currentKey, obj); } if ( _.isObject( obj ) ) { return _.object( results ) ; } return results; } });
простой обходной путь, который сохраняет правильный ключ и возвращает как объект Он по-прежнему используется так же, как я гость вы могли бы использовать эту функцию чтобы переопределить bugy _.функция map
или просто, как я использовал его в качестве подмешать
_.mapobj ( options , function( val, key, list )
можно использовать
_.mapValues(users, function(o) { return o.age; });
в Лодашь и_.mapObject({ one: 1, two: 2, three: 3 }, function (v) { return v * 3; });
в подчеркивания.Проверьте кросс-документацию здесь:http://jonathanpchen.com/underdash-api/#mapvalues-object-iteratee-identity