如何 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 = {};
});
我有以下对象说,
{"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 = {};
});