map
Funkcja w underscore.js, jeśli wywołana z obiektu JavaScript, zwraca tablicę wartości odwzorowanych od wartości obiektu.
_.map({one: 1, two: 2, three: 3}, function(num, key){ return num * 3; });
=> [3, 6, 9]
czy jest sposób, aby zachować klucze? tj. chcę funkcję, która zwraca
{one: 3, two: 6, three: 9}
javascript
underscore.js
lodash
xuanji
źródło
źródło
Odpowiedzi:
Z podkreśleniem
Podkreślenie zapewnia funkcję
_.mapObject
mapowania wartości i zachowania kluczy._.mapObject({ one: 1, two: 2, three: 3 }, function (v) { return v * 3; }); // => { one: 3, two: 6, three: 9 }
DEMO
Z Lodash
Lodash udostępnia funkcję
_.mapValues
mapowania wartości i zachowywania kluczy._.mapValues({ one: 1, two: 2, three: 3 }, function (v) { return v * 3; }); // => { one: 3, two: 6, three: 9 }
DEMO
źródło
_.map()
zwraca[['one', 3], ['two', 6], ['three', 9]]
, czyli tablicę tablic, i_.object()
zamienia ją z powrotem w obiekt.Udało mi się znaleźć wymaganą funkcję w lodash, bibliotece narzędziowej podobnej do podkreślenia.
http://lodash.com/docs#mapValues
źródło
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>
źródło
Wiem, że to jest stare, ale teraz Underscore ma nową mapę obiektów:
Możesz oczywiście zbudować elastyczną mapę zarówno dla tablic, jak i obiektów
_.fmap = function(arrayOrObject, fn, context){ if(this.isArray(arrayOrObject)) return _.map(arrayOrObject, fn, context); else return _.mapObject(arrayOrObject, fn, context); }
źródło
mapObject
;mapValues
zamiast tego spójrz na metodę lodash .A co z tą wersją w zwykłym JS ( ES6 / ES2015 )?
let newObj = Object.assign(...Object.keys(obj).map(k => ({[k]: obj[k] * 3})));
jsbin
Jeśli chcesz mapować obiekt rekurencyjnie (map nested obj), możesz to zrobić w następujący sposób:
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; };
jsbin
Od ES7 / ES2016 możesz użyć
Object.entries
zamiastObject.keys
tego:let newObj = Object.assign(...Object.entries(obj).map([k, v] => ({[k]: v * 3})));
źródło
Wiem, że minęło dużo czasu, ale nadal brakuje najbardziej oczywistego rozwiązania poprzez spasowanie (czyli zmniejszenie w js), ze względu na kompletność zostawię to tutaj:
function mapO(f, o) { return Object.keys(o).reduce((acc, key) => { acc[key] = f(o[key]) return acc }, {}) }
źródło
_.map zwraca tablicę, a nie obiekt.
Jeśli chcesz mieć obiekt, lepiej użyj innej funkcji, na przykład
each
; jeśli naprawdę chcesz używać mapy, możesz zrobić coś takiego:Object.keys(object).map(function(value, index) { object[value] *= 3; })
ale to jest mylące, gdy
map
ktoś spodziewałby się mieć tablicę jako wynik, a potem coś z nią zrobić.źródło
map
to, że jest używany do zmiany danych wejściowych, tworząc tablicę jako dane wyjściowe, możesz komponować_.object
i_.map
jako @GG. napisał, ale to kwestia gustu w tym momencie.Myślę, że potrzebujesz funkcji mapValues (do mapowania funkcji na wartości obiektu), która jest dość łatwa do zaimplementowania samodzielnie:
mapValues = function(obj, f) { var k, result, v; result = {}; for (k in obj) { v = obj[k]; result[k] = f(v); } return result; };
źródło
const mapObject = (obj = {}, mapper) => Object.entries(obj).reduce( (acc, [key, val]) => ({ ...acc, [key]: mapper(val) }), {}, );
źródło
Naprawiono miksowanie błędu mapy z podkreśleniem : 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; } });
Proste obejście, które zachowuje właściwy klawisz i zwraca go jako obiekt Nadal jest używane tak samo jak i guest Możesz użyć tej funkcji do nadpisania błędnej funkcji _.map
lub po prostu tak, jak użyłem go jako miksu
_.mapobj ( options , function( val, key, list )
źródło
Możesz używać
_.mapValues(users, function(o) { return o.age; });
w Lodash i_.mapObject({ one: 1, two: 2, three: 3 }, function (v) { return v * 3; });
Underscore.Sprawdź dokumentację krzyżową tutaj: http://jonathanpchen.com/underdash-api/#mapvalues-object-iteratee-identity
źródło
_.map używając do tego pętli lodash like
var result={}; _.map({one: 1, two: 2, three: 3}, function(num, key){ result[key]=num * 3; }); console.log(result) //output {one: 1, two: 2, three: 3}
Reduce is sprytny wygląda jak powyżej answare
_.reduce({one: 1, two: 2, three: 3}, function(result, num, key) { result[key]=num * 3 return result; }, {}); //output {one: 1, two: 2, three: 3}
źródło