我有以下对象,
{"id":"kl45wkfj1k4j34", "firstname":"Arun", "lastname":"K"}
我有要过滤的键,“名字,姓氏”使用逗号分隔符在字符串中分配。
如何过滤该对象以获得如下输出:
{"firstname":"Arun", "lastname":"K"}
pick
方法就是您正在寻找的。
var obj = { "id": 'kl45wkfj1k4j34', "firstname": "Arun", "lastname": "K" };
var filter = 'firstname, lastname',
var result = _.pick(obj, filter.split(', '));
有很多方法可以解决这个问题。到目前为止的答案假设您想要修改现有对象,但问题没有指定; “过滤器”这个词暗示也许不是。因此,如果您想创建一个新的过滤对象,而不是改变现有的对象,您可以使用reduce 函数。您说您的键列表是一个字符串,但为了保持示例干净,我们假设您只是执行
str.split(',')
或类似操作,因此在将其传递给这些函数之前它已经是一个数组。
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);
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);
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);
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
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 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;
});
如果您有数组,则更通用的解决方案
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 = {};
});
我已将解决方案从 @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
上。
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 !== "");
检查过滤属性是否具有值
如果你有对象数组,那么使用这个
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>');