JavaScript“地图”功能

JavaScript “map” function

本文关键字:功能 地图 JavaScript      更新时间:2023-09-26

看看JavaScript中的map方法,我做错了什么?

// Input: [ { name: "Kevin"}, { name: "Bob" } ]
// Output: [ { "Kevin" :0 }, { "Bob": 1 } ]
var map = function(arr, property) {
  var i = 0;
  var m = arr.prototype.map(makeKv);
  // Input: { name: "Kevin" }
  // Output: { "Kevin" = i } // GLOBAL
  
  function makeKv(item) {
    return {
      item: i++
    };
  };
  console.log("m : " + m);
};

JSFiddle

也请帮助我摆脱全局

这里有几个问题:

首先,

var m = arr.prototype.map(makeKv);

这里不需要prototype。只有在使用构造函数(如Array.prototype.map)时才能使用它。在这里,你只需要做arr.map

第二,

function makeKv(item) {
    return {item: i++};
};

您从不在任何地方声明i。你怎么能在不存在的东西上加一个呢。在此之前,您需要有var i = 0;

最后,return {item: i++};将生成一个名为的密钥(字面意思为"item")。您需要首先声明对象(var ret = {};),然后使用[item]来设置值。

Array.map的回调作为第一个参数传递给数组中的元素,因此item将是一个对象。您需要执行item[property]才能获得所需的值。

附言:不要在console.log中执行"m : " + m,这将连接字符串,从而将m转换为字符串。改为使用,console.log("m : ", m);

所以,大家一起试试:

var map = function(arr, property) { 
    var i = 0;        
    var m = arr.map(makeKv);
    function makeKv(item) {
        var ret = {};
        ret[item[property]] = i++;
        return ret;
    };
    console.log("m : ", m);
}

演示:http://jsfiddle.net/FgdSj/3/

EDITArray.map的回调被传递给数组中的索引作为第二个参数,因此这里不需要var i = 0;

var map = function(arr, property) {      
    var m = arr.map(makeKv);
    function makeKv(item, index) {
        var ret = {};
        ret[item[property]] = index;
        return ret;
    };
    console.log("m : ", m);
}

演示:http://jsfiddle.net/FgdSj/5/

arr.prototype.map(makeKv);

应该是

arr.map(makeKv);

现在你有另一个问题,因为它将返回

[ { item : 0}, { item : 1} ]

如果将映射函数更改为

function makeKv(item) {
    var x = {}
    x[item.name] = i++;        
    return x;
};

它会给你想要的。

JSFiddle

只需直接调用.map

arr.map(makeKv)

I、 无论出于何种原因(可能map被覆盖),您都希望使用Array.prototype的方法

[].map.call(arr, makeKv);

这是,一切都为你准备好了,以匹配你想要的输出

// input: [{name: "Kevin"}, {name: "Bob"}], "name"
var map = function(arr, property) { 
    var i = 0; 
    function makeKv(item) {
        var obj = {};
        obj[item[property] = i++;
        return obj;
    };
    return arr.map(makeKv);
}
var result = map([{name: "Kevin"}, {name: "Bob"}], "name");
console.log(result);
// [{"Kevin" : 0}, {"Bob" : 1}];
var map = function(arr, property) { 
    var i = 0; 
    var m = Array.prototype.map(makeKv);
    // input: {name: "Kevin"}
    // output: "Kevin" = i // GLOBAL
    function makeKv(item) {
        return {item: i++};
    };
    console.log("m : " + m);
    return m;
}
map();