看着地图功能在JavaScript中,我究竟做错了什么?
// 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
另外,如果你能帮助我高兴摆脱了全球的太多。
这里有几个问题:
第一,
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
,将Concat的字符串,从而把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);
}
DEMO: 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);
}
DEMO: 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)
我,无论出于何种原因(也许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();