如何在Javascript

问题描述:

我有以下对象说,选择一个对象的属性,如何在Javascript

{"id":"kl45wkfj1k4j34", "firstname":"Arun", "lastname":"K"} 

,我必须要过滤的关键,“名字,姓氏”使用逗号分隔字符串分配

如何筛选对象得到的输出如下:

{"firstname":"Arun", "lastname":"K"} 
+0

该对象具有无效的键和值。 – Jai

+0

更正了关键值对 –

下划线的pick方法是你在找什么。

var obj = { "id": 'kl45wkfj1k4j34', "firstname": "Arun", "lastname": "K" }; 
var filter = 'firstname, lastname', 
var result = _.pick(obj, filter.split(', ')); 
+0

谢谢..工作就像一阵微风:-) –

如果你有这样的对象:

var obj = {"id":"kl45wkfj1k4j34", "firstname":"Arun", "lastname":"K"}; 

然后,你可以这样做:

delete obj.id; 
console.log(obj); 

现在按照评论:

var newlist = listarray.map(function (obj){ 
     delete obj.id; 
     return obj; 
}); 

这将创建一个没有id的新列表数组。


或特定键:

var newlist = listarray.map(function (obj){ 
     var o = {}; 
     o.firstname = obj.firstname; 
     o.lastname = obj.lastname; 
     return o; 
}); 
+0

我得到了这个,但事情就像我有过滤键的列表,用逗号分隔的字符串。任何通用的解决方案建议? –

你可以使用你的过滤字符串,分裂为新对象的键。

var obj = { "id": 'kl45wkfj1k4j34', "firstname": "Arun", "lastname": "K" }, 
 
    filter = 'firstname, lastname'.split(', '), 
 
    result = {}; 
 

 
filter.forEach(function (k) { 
 
    result[k] = obj[k]; 
 
}); 
 

 
document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');

如果你有对象的数组,然后使用这个

data = [{ 
 
    "id": "kl45wkfj1k4j34", 
 
    "firstname": "Arun1", 
 
    "lastname": "K1" 
 
}, { 
 
    "id": "kl45wkfj1k4j14", 
 
    "firstname": "Arun2", 
 
    "lastname": "K2" 
 
}, { 
 
    "id": "2", 
 
    "firstname": "Arun3", 
 
    "lastname": "K3" 
 
}]; 
 

 
data = data.map(function(o) { 
 
    delete o.id; 
 
    return o 
 
}) 
 

 
document.write('<pre>' + JSON.stringify(data, 0, 4) + '</pre>');

使用_.reduce

var data = {"id":"kl45wkfj1k4j34", "firstname":"Arun", "lastname":"K"} 
var filters = 'firstname, lastname'.split(', '); 
_.reduce(data,function(result,value,key){ 
if(filters.indexOf(key)!=-1){ 
    result[key] =value 
} 
return result; 
},{}) 

var toBeFilteredObject = {...}; // {"id":"kl45wkfj1k4j34", "firstname":"Arun", "lastname":"K"} 
var filteredObject = {}; 
'comma, seperated, string'.split(',').forEach(function(key) { 
    key = key.trim(); 
    filteredObject[key] = toBeFilteredObject[key]; 
}); 

有很多的方法之一可以去这个问题。到目前为止的答案假设你想修改现有的对象,但问题没有指定; “过滤器”一词暗示可能不是。所以如果你想创建一个新的过滤对象,而不是改变现有的对象,你可能会使用reduce函数。你说你的关键列表是一个字符串,但为了保持例子清洁,让我们假设你只是做str.split(',')或类似的,所以它已经是一个数组,然后将它传递给这些函数。

ES5

function createObjectFilter(keys) { 
    return function(obj) { 
    return keys.reduce(function(acc, key) { 
     acc[key] = obj[key]; 
     return acc; 
    }, {}); 
    }; 
} 

var myFilter = createObjectFilter([ 'a', 'b' ]); 

var filteredObject = myFilter(object); 

ES6

const createObjectFilter = keys => obj => keys.reduce((acc, key) => { 
    acc[key] = obj[key]; 
    return acc; 
}, {}); 

const myFilter = createObjectFilter([ 'a', 'b' ]); 

const filteredObject = myFilter(object); 

现在,createObjectFilter函数返回基于键的定列表上的实际过滤功能。相反,您可以将它“一体化”,但这种方法的优点是可以在更多情况下重用您的过滤器。例如:

const filteredObjects = unfilteredObjects.map(myFilter);