map function for objects (instead of arrays)

前端 未结 30 1920
无人及你
无人及你 2020-11-22 04:23

I have an object:

myObject = { \'a\': 1, \'b\': 2, \'c\': 3 }

I am looking for a native method, similar to Array.prototype.map

相关标签:
30条回答
  • 2020-11-22 04:54
    var myObject = { 'a': 1, 'b': 2, 'c': 3 };
    
    
    Object.prototype.map = function(fn){
        var oReturn = {};
        for (sCurObjectPropertyName in this) {
            oReturn[sCurObjectPropertyName] = fn(this[sCurObjectPropertyName], sCurObjectPropertyName);
        }
        return oReturn;
    }
    Object.defineProperty(Object.prototype,'map',{enumerable:false});
    
    
    
    
    
    newObject = myObject.map(function (value, label) {
        return value * value;
    });
    
    
    // newObject is now { 'a': 1, 'b': 4, 'c': 9 }
    
    0 讨论(0)
  • 2020-11-22 04:56

    I came here looking to find and answer for mapping an object to an array and got this page as a result. In case you came here looking for the same answer I was, here is how you can map and object to an array.

    You can use map to return a new array from the object like so:

    var newObject = Object.keys(myObject).map(function(key) {
       return myObject[key];
    });
    
    0 讨论(0)
  • 2020-11-22 04:57
    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}]}]}
    

    This function goes recursively through the object and arrays of objects. Attributes can be deleted if returned undefined

    0 讨论(0)
  • 2020-11-22 04:58

    you can use map method and forEach on arrays but if you want to use it on Object then you can use it with twist like below:

    Using Javascript (ES6)

    var obj = { 'a': 2, 'b': 4, 'c': 6 };   
    Object.entries(obj).map( v => obj[v[0]] *= v[1] );
    console.log(obj); //it will log as {a: 4, b: 16, c: 36}
    
    var obj2 = { 'a': 4, 'b': 8, 'c': 10 };
    Object.entries(obj2).forEach( v => obj2[v[0]] *= v[1] );
    console.log(obj2); //it will log as {a: 16, b: 64, c: 100}
    

    Using jQuery

    var ob = { 'a': 2, 'b': 4, 'c': 6 };
    $.map(ob, function (val, key) {
       ob[key] *= val;
    });
    console.log(ob) //it will log as {a: 4, b: 16, c: 36}
    

    Or you can use other loops also like $.each method as below example:

    $.each(ob,function (key, value) {
      ob[key] *= value;
    });
    console.log(ob) //it will also log as {a: 4, b: 16, c: 36}
    
    0 讨论(0)
  • 2020-11-22 04:58

    The map function does not exist on the Object.prototype however you can emulate it like so

    var myMap = function ( obj, callback ) {
    
        var result = {};
    
        for ( var key in obj ) {
            if ( Object.prototype.hasOwnProperty.call( obj, key ) ) {
                if ( typeof callback === 'function' ) {
                    result[ key ] = callback.call( obj, obj[ key ], key, obj );
                }
            }
        }
    
        return result;
    
    };
    
    var myObject = { 'a': 1, 'b': 2, 'c': 3 };
    
    var newObject = myMap( myObject, function ( value, key ) {
        return value * value;
    });
    
    0 讨论(0)
  • 2020-11-22 04:59

    Define a function mapEntries.

    mapEntries takes a callback function that is called on each entry in the object with the parameters value, key and object. It should return the a new value.

    mapEntries should return a new object with the new values returned from the callback.

    Object.defineProperty(Object.prototype, 'mapEntries', {
      enumerable: false,
      value: function (mapEntriesCallback) {
        return Object.fromEntries(
          Object.entries(this).map(
            ([key, value]) => [key, mapEntriesCallback(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}
    

    Edit: A previous version didn't specify that this is not an enumerable property

    0 讨论(0)
提交回复
热议问题