функция карты для объектов (вместо массивов)

Предположим, что ваша шестнадцатеричная строка похожа на

>>> hex_string = "deadbeef"

Преобразует ее в строку (Python ≤ 2.7):

>>> hex_data = hex_string.decode("hex")
>>> hex_data
"\xde\xad\xbe\xef"

или с Python 2.7 и Python 3.0:

>>> bytes.fromhex(hex_string)  # Python ≥ 3
b'\xde\xad\xbe\xef'

>>> bytearray.fromhex(hex_string)
bytearray(b'\xde\xad\xbe\xef')

Обратите внимание, что bytes является неизменной версией bytearray.

813
задан Will Ness 7 February 2016 в 22:01
поделиться

5 ответов

Объектный Картопостроитель в TypeScript

, мне нравятся примеры, которые используют 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 вместо этого.

-2
ответ дан orad 28 July 2019 в 16:44
поделиться
  • 1
    вывод на Сновещательном Ubuntu является сценарием (util-linux 2.19.1) – J. Kevin Corcoran 6 December 2012 в 04:17

Я обрабатываю только строки для сокращения льгот:

Object.keys(params).map(k => typeof params[k] == "string" ? params[k] = params[k].trim() : null);
0
ответ дан 22 November 2019 в 21:03
поделиться

Определите функцию mapEntries.

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}
1
ответ дан 22 November 2019 в 21:03
поделиться

Объектный Картопостроитель в TypeScript

, мне нравятся примеры, которые используют 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-фрезам ответ .

0
ответ дан 22 November 2019 в 21:03
поделиться
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}]}]}

Эта функция идет рекурсивно через объект и массивы объектов. Атрибуты могут быть удалены, если возвращено неопределенные

0
ответ дан 22 November 2019 в 21:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: