如何在Javascript中从对象中选择属性

时间:2016-02-27 08:15:53

标签: javascript underscore.js

我有以下物体说,

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

我有要过滤的密钥,使用逗号分隔符在字符串中分配' firstname,lastname'

如何过滤该对象以获取输出,如下所示:

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

7 个答案:

答案 0 :(得分:4)

下划线的pick方法是您正在寻找的方法。

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

答案 1 :(得分:2)

有很多方法可以解决这个问题。到目前为止,答案假设您要修改现有对象,但问题未指定; “过滤器”这个词暗示可能不是。因此,如果要创建新的过滤对象,而不是改变现有过滤对象,则可以使用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);

答案 2 :(得分:1)

如果你有这个对象:

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

答案 3 :(得分:1)

您可以使用过滤字符串,将其拆分为新对象的键。

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>');

答案 4 :(得分:1)

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

答案 5 :(得分:0)

如果您有对象数组,请使用此

 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>');

答案 6 :(得分:0)

使用_.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;
},{})