如何 select Javascript 中对象的属性

How to select properties from an object in Javascript

我有以下对象说,

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

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

如何过滤该对象以获得如下输出:

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

如果你有这个对象:

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

Object.fromEntries 使用 key/value 对数组派上用场。

为此,您可以先拆分字符串并映射成对。

const
    object = { id: 'kl45wkfj1k4j34', firstname: "Arun", lastname: "K" },
    filter = 'firstname, lastname',
    keys = filter.split(', ');
    result = Object.fromEntries(keys.map(k => [k, object[k]]));

console.log(result);

如果你有对象数组,那么使用这个

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

Underscore 的 pick 方法就是您要找的。

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

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

有很多方法可以解决这个问题。到目前为止的答案假设你想修改现有的对象,但问题没有具体说明; "filter" 这个词暗示也许不是。所以如果你想创建一个新的过滤对象,而不是改变现有的对象,你可以使用 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 函数 returns 是基于给定键列表的实际过滤函数。您可以改为 "all in one",但这种方法的优点是可以在更多情况下重用您的过滤器。例如:

const filteredObjects = unfilteredObjects.map(myFilter);

更通用的解决方案,如果你有数组

var obj = [{ "id": 'kl45wkfj1k4j34', "firstname": "Arun", "lastname": "K" }, { "id": '34234', "firstname": "kajshd", "lastname": "ajsdh" }, { "id": '263742', "firstname": "asdjasd", "lastname": "asdjahs" }],
    filter = 'firstname, lastname'.split(', '),
    result = {}; 
var output = [];
obj.forEach(function(i, j) {
  filter.forEach(function (k) {
    // console.log(obj[j]);
    result[k] = obj[j][k];
  }); 
  output.push(result); 
  result = {};
});