我需要一个给出属性列表的函数,仅保留键中存在的值。
示例:
attrs = ['a', 'b', 'c']
obj = {'a': 1, 'b': 2, 'c': 3}
return = {'a': 1, 'b': 2, 'c': 3}
attrs = ['a', 'b']
obj = {'a': 1, 'b': 2, 'c': 3}
return = {'a': 1, 'b': 2}
这是我目前所拥有的,但是没有按预期工作:
this.keepKnownAttributes = function(attrs, obj) {
let ret = {};
attrs.forEach((attr) => {
if(obj.hasOwnProperty(attr)){
Object.assign(ret, {attr: obj[attr]});
}
});
return ret;
};
答案 0 :(得分:2)
您可以使用.reduce
从当前键数组中构建新对象:
const filterObj = (attr, obj) =>
attr.reduce((acc, key) => (acc[key] = obj[key], acc), {})
console.log(filterObj(['a', 'b', 'c'], {'a': 1, 'b': 2, 'c': 3}));
console.log(filterObj(['a', 'b'], {'a': 1, 'b': 2, 'c': 3}));
答案 1 :(得分:1)
您可以使用Object.keys()
和.reduce()
方法:
const attrs1 = ['a', 'b', 'c']
const obj1 = {'a': 1, 'b': 2, 'c': 3}
const attrs2 = ['a', 'b']
const obj2 = {'a': 1, 'b': 2, 'c': 3}
const filterObj = (arr, obj) => Object.keys(obj)
.filter(k => arr.includes(k))
.reduce((r, c) => (r[c] = obj[c], r), {})
console.log(filterObj(attrs1, obj1));
console.log(filterObj(attrs2, obj2));
答案 2 :(得分:1)
只需使用reduce并传递一个空的Object
。在每次迭代中,只需将属性从obj
复制到accumulator
,然后将其返回。
以下版本添加了attrs
function test(attrs, obj) {
return attrs.reduce(function(accumulator, currentValue) {
accumulator[currentValue] = obj[currentValue];
return accumulator;
}, {});
}
console.log(test(['a', 'b', 'c'], { 'a': 1, 'b': 2, 'c': 3 }));
console.log(test(['a', 'b'], { 'a': 1, 'b': 2, 'c': 3 }));
console.log(test(['a', 'b', 'c'], { 'a': 1, 'b': 2 }));
以下版本仅添加attrs
和obj
中都存在的元素
function test(attrs, obj) {
return attrs.reduce(function(accumulator, currentValue) {
if(obj.hasOwnProperty(currentValue))
accumulator[currentValue] = obj[currentValue];
return accumulator;
}, {});
}
console.log(test(['a', 'b', 'c'], { 'a': 1, 'b': 2, 'c': 3 }));
console.log(test(['a', 'b'], { 'a': 1, 'b': 2, 'c': 3 }));
console.log(test(['a', 'b', 'c'], { 'a': 1, 'b': 2 }));
这是短箭头版本
function test(attrs, obj) {
return attrs.reduce((a, c) => { a[c] = obj[c]; return a; }, {});
}
console.log(test(['a', 'b', 'c'], { 'a': 1, 'b': 2, 'c': 3 }));
console.log(test(['a', 'b'], { 'a': 1, 'b': 2, 'c': 3 }));
console.log(test(['a', 'b', 'c'], { 'a': 1, 'b': 2 }));
和田田。如果您只是Object.keys
数组而不是Array.prototype.filter
的属性,则无需使用reduce
或object
。
答案 3 :(得分:0)
使用.hasOwnProperty()
方法。如果对象具有该属性,则返回true。 Refer
var attrs = ['a', 'b']
var obj = {
'a': 1,
'b': 2,
'c': 3
}
var obj1 = {};
attrs.forEach(e =>obj.hasOwnProperty(e)?obj1[e] = obj[e]:false)
console.log(obj1)
答案 4 :(得分:0)
您可以遍历对象的所有键,并将它们存储到包含要删除的键的数组中。以后,您可以简单地使用delete
删除对象的属性。您可以使用Object.keys(obj)
获取包含所有键的列表。
attrs1 = ['a', 'b', 'c']
obj1 = {
'a': 1,
'b': 2,
'c': 3
}
attrs2 = ['a', 'b']
obj2 = {
'a': 1,
'b': 2,
'c': 3
}
keepKnownAttributes = function(attrs, obj) {
let keysToDelete = [];
Object.keys(obj).forEach(key => {
if (!attrs.includes(key)) {
keysToDelete.push(key);
}
});
keysToDelete.forEach(key => {
delete obj[key];
});
return obj;
};
console.log(keepKnownAttributes(attrs1, obj1));
console.log(keepKnownAttributes(attrs2, obj2));
可以使用一些lambda函数来缩小示例
attrs1 = ['a', 'b', 'c']
obj1 = {
'a': 1,
'b': 2,
'c': 3
}
attrs2 = ['a', 'b']
obj2 = {
'a': 1,
'b': 2,
'c': 3
}
keepKnownAttributes = function(attrs, obj) {
Object.keys(obj).filter(e => !attrs.includes(e)).map(key => delete obj[key]);
return obj;
};
console.log(keepKnownAttributes(attrs1, obj1));
console.log(keepKnownAttributes(attrs2, obj2));
实际上,您无需返回任何内容,因为您修改了原始对象。干杯!
答案 5 :(得分:0)
您可以使用Array.prototype.filter()
和Array.prototype.reduce()
进行操作。首先过滤掉attrs
中存在的键,然后返回包含过滤后的键及其值的新对象。
let obj = {'a': 1, 'b': 2, 'c': 3}
function remove(obj,attrs){
return Object.keys(obj).filter(a => attrs.includes(a)).reduce((ac,a) => {
ac[a] = obj[a];
return ac;
},{})
}
console.log(remove(obj,['a','b','c']));
console.log(remove(obj,['a','b']));
答案 6 :(得分:0)
您可以使用reduce:
const attrs = ['a', 'b']
const obj = {'a': 1, 'b': 2, 'c': 3}
const obj2 = attrs.reduce((acc, key) =>
(acc[key] = obj[key], acc)
, {});
作为通用函数,如下所示:
const filterAttrsFrom = (target, attrs) =>
attrs.reduce((acc, key) =>
(acc[key] = target[key], acc)
, {});
答案 7 :(得分:0)
这也有效;-)
function someName(attrs, obj) {
let newObj = {};
for (var object in obj) {
if (attrs.includes(object)) {
newObj[object] = obj[object];
}
}
return newObj
}
console.log(someName(["a", "b"], { a: 1, b: 2, c: 3 }));