1

查看 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);
}

http://jsfiddle.net/FgdSj/2

另外,如果你能帮助我也摆脱全球

4

4 回答 4

3

这里有几个问题:

第一的,

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]才能得到你想要的价值。

PS不要"m : " + m在你的console.log,这将连接字符串,从而转换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/

编辑Array.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/

于 2013-11-18T18:40:24.377 回答
1
arr.prototype.map(makeKv);

应该

arr.map(makeKv);

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

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

如果将映射函数更改为

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

它会给你你想要的。

JSFiddle

于 2013-11-18T18:35:34.553 回答
1

.map直接打电话就好了

arr.map(makeKv)

我,无论出于何种原因(可能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}];
于 2013-11-18T18:36:23.237 回答
0
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();
于 2013-11-18T18:40:32.480 回答