我正在尝试使用纯JS重新创建Underscore pluck函数。但是,我一直在返回一个未定义的数组,而不是数组中对象属性的实际值。
检查另一个帖子here我发现您可以使用以下代码在jQuery中重现它...
$.pluck = function(arr, key) {
return $.map(arr, function(e) { return e[key]; })
}
...但是我很难在纯JS中复制它。我尝试了以下内容,但这只是为我返回一个undefined数组。
var pluck = function(arr,key){
var newArr = [];
for (var i = 0, x = arr.length; i < x; i++){
if (arr[i].hasOwnProperty(key)){
newArr.push(arr[i].key)
}
}
return newArr;
}
所以,目标将是以下,除了使用下划线_.pluck,只需使用JS函数名称,例如。 var pluck = function(arr,key){...}
var Tuts = [{name : 'NetTuts', niche : 'Web Development'}, {name : 'WPTuts', niche : 'WordPress'}, {name : 'PSDTuts', niche : 'PhotoShop'}, {name : 'AeTuts', niche : 'After Effects'}];
var niches = _.pluck(Tuts, 'niche');
console.log(niches);
// ["Web Development", "WordPress", "PhotoShop", "After Effects"]
有人能引导我朝正确的方向前进吗?
答案 0 :(得分:23)
在ES5中:
function pluck(array, key) {
return array.map(function(obj) {
return obj[key];
});
}
在ES6中:
function pluck(array, key) {
return array.map(o => o[key]);
}
答案 1 :(得分:14)
您可以使用原生JavaScript .map()
:
Array.prototype.pluck = function(key) {
return this.map(function(object) { return object[key]; });
};
编辑 - 修改内置原型对象时应小心谨慎;添加函数的一种更好的方法(如果您对这样做的想法一般可行)将使用Object.defineProperty
,以便可以使其不可枚举:
Object.defineProperty(Array.prototype, "pluck", {
value: function(key) {
return this.map(function(object) { return object[key]; });
}
});
答案 2 :(得分:7)
你是如此亲密。你需要改变:
newArr.push(arr[i].key);
为:
newArr.push(arr[i][key]);
考虑一下:
var obj = { myKey: 'my Value', theKey: 'another value' };
var theKey = 'myKey';
alert(obj.theKey); // another value
alert(obj[theKey]); // my Value
// You can also send in strings here:
alert(obj['theKey']); // another value
希望你明白我的意思。
答案 3 :(得分:0)
function pluck(array,key){
var a = [],
i1 = -1, i2 = array.length,
o ;
while(++i1 < i2)
{
o = array[i1] ; // you have to use the bracket operator here
if(o.hasOwnProperty(key)) a[a.length] = o[key] ;
}
return a ;
}
我并没有真正改变这一切。您的代码失败的原因是您使用点运算符.key
来访问数组元素的命名属性而不是括号运算符[key]
。使用引用作为键时,需要使用括号运算符。
答案 4 :(得分:0)
减少如何:
$.pluck = function(arr, key) {
return arr.reduce(function(p, v) {
return p.concat(v[key]);
}, []);
}
var people = [
{ name: 'James', age: 26 },
{ name: 'Fred', age: 56 }
];
$.pluck(people, 'age');
=> [26, 56]
$.pluck(people, 'name');
=> ['James', 'Fred']
答案 5 :(得分:-3)
var array = {
name: ["Pedro", "João", "Francisco", "Diogo"],
ID: [1,2,3,4]
};
console.log(pluck(array,'name'));
function pluck(array, key) {
return (array[key]);
};
你可以使用这个功能,点击JSFiddle查看一个例子!! :)