Предположим, что ваша шестнадцатеричная строка похожа на
>>> hex_string = "deadbeef"
>>> hex_data = hex_string.decode("hex")
>>> hex_data
"\xde\xad\xbe\xef"
>>> bytes.fromhex(hex_string) # Python ≥ 3
b'\xde\xad\xbe\xef'
>>> bytearray.fromhex(hex_string)
bytearray(b'\xde\xad\xbe\xef')
Обратите внимание, что bytes
является неизменной версией bytearray
.
, мне нравятся примеры, которые используют Object.fromEntries
такой в качестве [1 110] этот , но тем не менее это не очень просто в использовании. Ответы, которые используют Object.keys
и затем ищут key
на самом деле, делают несколько поисков, которые не могут быть необходимыми.
я соглашаюсь с [1 111] @alexander-mills , что должны быть помехи Object.map
функция. Я расширил его реализацию в TypeScript и получил это:
Использование:
const myObject = { 'a': 1, 'b': 2, 'c': 3 };
// keep the key and modify the value
let obj = Object.map(myObject, val => val * 2);
// obj = { a: 2, b: 4, c: 6 }
// modify both key and value
obj = Object.map(myObject,
val => val * 2 + '',
key => (key + key).toUpperCase());
// obj = { AA: '2', BB: '4', CC: '6' }
Код:
interface Dictionary<T> {
[key: string]: T;
}
interface ObjectConstructor {
map<TValue, TResult>(
obj: Dictionary<TValue>,
valSelector: (val: TValue, obj: Dictionary<TValue>) => TResult,
keySelector?: (key: string, obj: Dictionary<TValue>) => string,
ctx?: Dictionary<TValue>
): Dictionary<TResult>;
}
function objectMap<TValue, TResult>(
obj: Dictionary<TValue>,
valSelector: (val: TValue, obj: Dictionary<TValue>) => TResult,
keySelector?: (key: string, obj: Dictionary<TValue>) => string,
ctx?: Dictionary<TValue>
) {
const ret = {} as Dictionary<TResult>;
for (const key of Object.keys(obj)) {
const retKey = keySelector
? keySelector.call(ctx || null, key, obj)
: key;
const retVal = valSelector.call(ctx || null, obj[key], obj);
ret[retKey] = retVal;
}
return ret;
}
Object.map = objectMap;
, Если Вы не хотите TypeScript (почему?) тогда копируют вышеупомянутый код в [1 112] Детская площадка TypeScript для получения кода JavaScript.
причина я поместил 116-секундный, то, потому что это является дополнительным.
кроме того, так как это не изменяет Object
прототип, я думаю, что безопасно, но если Вы не хотите затрагивать эти Object
интерфейс, можно просто удалить последнюю строку и использование objectMap
вместо этого.
Я обрабатываю только строки для сокращения льгот:
Object.keys(params).map(k => typeof params[k] == "string" ? params[k] = params[k].trim() : null);
mapEntries берет функцию обратного вызова, которую называют на каждой записи в объекте со значением параметров, ключом и объектом. Это должно возвратить новое значение.
mapEntries должен возвратить новый объект с новыми значениями, возвращенными от обратного вызова.
Object.prototype.mapEntries = function(mapEntriesCB) {
return Object.fromEntries(Object.entries(this).map(
([key, value]) => [key, mapEntriesCB(value, key, this)]
));
}
// Usage example:
var object = {a: 1, b: 2, c: 3}
var newObject = object.mapEntries(value => value * value)
console.log(newObject)
//> {a: 1, b: 4, c: 9}
, мне нравятся примеры, которые используют Object.fromEntries
такой в качестве [1 111] этот , но тем не менее, они не очень просты в использовании. Ответы, которые используют Object.keys
и затем ищут эти key
, на самом деле делают несколько поисков, которые не могут быть необходимыми.
мне было жаль, что не было Object.map
функция, но мы можем создать наше собственное и назвать ее objectMap
со способностью изменить и key
и value
:
Использование (JavaScript):
const myObject = { 'a': 1, 'b': 2, 'c': 3 };
// keep the key and modify the value
let obj = objectMap(myObject, val => val * 2);
// obj = { a: 2, b: 4, c: 6 }
// modify both key and value
obj = objectMap(myObject,
val => val * 2 + '',
key => (key + key).toUpperCase());
// obj = { AA: '2', BB: '4', CC: '6' }
Код (Машинописный текст):
interface Dictionary<T> {
[key: string]: T;
}
function objectMap<TValue, TResult>(
obj: Dictionary<TValue>,
valSelector: (val: TValue, obj: Dictionary<TValue>) => TResult,
keySelector?: (key: string, obj: Dictionary<TValue>) => string,
ctx?: Dictionary<TValue>
) {
const ret = {} as Dictionary<TResult>;
for (const key of Object.keys(obj)) {
const retKey = keySelector
? keySelector.call(ctx || null, key, obj)
: key;
const retVal = valSelector.call(ctx || null, obj[key], obj);
ret[retKey] = retVal;
}
return ret;
}
, Если Вы не используете TypeScript затем, копируют вышеупомянутый код в [1 112] Детская площадка TypeScript для получения кода JavaScript.
кроме того, причина я поместил keySelector
после valSelector
в списке параметров, то, потому что это является дополнительным.
* Некоторый кредит переходят к alexander-фрезам ответ .
const mapObject = (targetObject, callbackFn) => {
if (!targetObject) return targetObject;
if (Array.isArray(targetObject)){
return targetObject.map((v)=>mapObject(v, callbackFn))
}
return Object.entries(targetObject).reduce((acc,[key, value]) => {
const res = callbackFn(key, value);
if (!Array.isArray(res) && typeof res ==='object'){
return {...acc, [key]: mapObject(res, callbackFn)}
}
if (Array.isArray(res)){
return {...acc, [key]: res.map((v)=>mapObject(v, callbackFn))}
}
return {...acc, [key]: res};
},{})
};
const mapped = mapObject(a,(key,value)=> {
if (!Array.isArray(value) && key === 'a') return ;
if (!Array.isArray(value) && key === 'e') return [];
if (!Array.isArray(value) && key === 'g') return value * value;
return value;
});
console.log(JSON.stringify(mapped));
// {"b":2,"c":[{"d":2,"e":[],"f":[{"g":4}]}]}
Эта функция идет рекурсивно через объект и массивы объектов. Атрибуты могут быть удалены, если возвращено неопределенные