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

问题描述 投票:0回答:10

我有以下对象,

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

我有要过滤的键,“名字,姓氏”使用逗号分隔符在字符串中分配。

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

{"firstname":"Arun", "lastname":"K"}
javascript underscore.js
10个回答
7
投票

Underscore 的

pick
方法就是您正在寻找的。

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

4
投票

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

4
投票

Object.fromEntries
使用键/值对数组非常方便。

要准备这个,您可以先拆分字符串并映射对。

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


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

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

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" }, { "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 = {};
});

0
投票

我已将解决方案从 @Nina 调整为 TypeScript,并对其进行了改进。

/**
 * Constructs a new object by picking certain properties of the given object.
 * Example: `const publicUser = pick(user, ['id', 'name'])`.
 * Adapted from https://stackoverflow.com/a/35667463/4034572.
 */
export function pick<T extends object, K extends keyof T>(
  object: T,
  keys: K[]
): Pick<T, K> {
  const entries = keys.filter((k) => k in object).map((k) => [k, object[k]])
  return Object.fromEntries(entries)
}

使用示例:

type User = {
  readonly id: number
  name: string
  email: string
  password: string
}

type PublicUser = Pick<User, 'id' | 'name'>

const user: User = {
  id: 2,
  name: 'Albert',
  email: '[email protected]',
  password: 'pwd',
}

const publicUser: PublicUser = pick(user, ['id', 'name'])
// publicUser is { id: 2, name: 'Albert' }

好处是 TypeScript 不允许您使用无效的密钥。例如,执行

pick(user, ['xyz'])
会引发错误 TS2322:类型“xyz”不可分配给类型“keyof User”

你也会得到自动完成功能:)

改进

我添加了

filter((k) => k in object)
,因为如果不这样做
pick(user, ['xyz'])
就会给出
{ xyz: undefined }
,添加类型
User
上不存在的属性。

但是,使用

filter
,它会正确给出
{}
,这是有意义的,因为属性
xyz
不存在于
User
上。


0
投票
const form = { some: "one", prop: "two", value: "three", foo: "f", bar: "b"},
hasFilled = Object.values(
    Object.fromEntries(
      "some, prop, value".split(", ").map((k) => [k, form[k]]),
    ),
  ).every((i) => i !== "");

检查过滤属性是否具有值


-1
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.