gpt4 book ai didi

javascript - 对象属性的深度过滤

转载 作者:行者123 更新时间:2023-12-03 10:43:09 24 4
gpt4 key购买 nike

我正在寻找一种能够根据某种数据格式过滤对象属性的方法。假设我有一个像这样的对象:

var data = {
name : {
first : "Sam",
last : "Wise",
invalid : "Not A Valid Property"
},
address : "210 Test St.",
city : "Springfield",
state : "CA",
zip : "65565",
invalid_key1: "Something invalid",
invalid_key2: "Another invalid one"
}

理想情况下,我想创建一个方法来深入检查每个属性,以仅允许过滤对象中存在的键。我有一个适用于浅层对象的版本,但是我还没有想出一种针对子对象/数组执行此操作的巧妙方法。

var controlObject = {
'name' : {
first : true,
last : true
},
'address' : true,
'city' : true,
'state' : true,
'zip' : true
};

filterObj(data, controlObject);
// Would return:
// {
// name : {
// first : "Sam",
// last : "Wise"
// },
// address : "210 Test St.",
// city : "Springfield",
// state : "CA",
// zip : "65565"
// }

这是我当前的版本,仅检查一层深度。

_.mixin({
filterObj : function(data, control) {
// First set some defaults.
var _data = data || {};
var _control = control || {};

// Create arguments to be passed to _.pick()
var controlKeys = Object.keys(_control);
var args = [_data].concat(controlKeys);

// Finally use _.pick() to filter object properties.
return _.pick.apply(_, args);
}
});

我尝试做一些欺骗来让它检查更深层次的对象,但它似乎没有正确执行。

_.mixin({ 
filterObj : function(data, control) {
// First set some defaults.
var _data = data || {};
var _control = control || {};

// Create arguments to be passed to _.pick()
var controlKeys = Object.keys(_control);
var args = [_data].concat(controlKeys);

// Finally use _.pick() to filter object properties.
var results = _.pick.apply(_, args);

var moreKeys = Object.keys(_control).filter(function(key) {
return ( _data[key] == "object" || _data[key] == "array" ) ? true : false
});

if( moreKeys.length ) {
_.each(moreKeys, function(key) {
results[key] = _.filterObj(_data[key], _control[key]);
});
return results;
} else {
return results;
}
}
});

目前,它被设置为 Underscore mixin,尽管我并不认同这个概念(只是让它更容易在我的应用程序中使用)。

最佳答案

我知道这个帖子已经有两年了,但我也有和你类似的要求。除了你之外,我手头没有 Lodash/Underscore,所以我想出了一个纯 JavaScript 解决方案:

function filterObj(data, control) {
var controlKeys = Object.keys(control),
results = controlKeys.reduce(function(v, key) {
if (control[key] === true && data.hasOwnProperty(key)) {
v[key] = data[key];
}

return v;
}, {});

controlKeys.filter(function(key) {
return typeof control[key] === 'object' && control[key] !== null && !Array.isArray(control[key]) && typeof data[key] === 'object' && data[key] !== null && !Array.isArray(data[key]);
}).forEach(function(key) {
results[key] = filterObj(data[key], control[key]);
});

return results;
}

var data = {
name: {
first: 'Sam',
last: 'Wise',
invalid: 'Not A Valid Property'
},
gender: 'm',
password: 'abc123',
location: {
address: '210 Test St.',
city: 'Springfield',
state: 'CA',
zip: '65565'
},
invalid_key1: 'Something invalid',
invalid_key2: 'Another invalid one'
}

var controlObject = {
name: {
first: true,
last: true
},
gender: true,
password: false,
location: true
};

console.log(filterObj(data, controlObject));

请注意,我改变了您最初方法的一些逻辑:

  • 必须将选项标记为 true 才能不被过滤掉(严格比较)
  • 可以标记整个(子)对象,以便将其包含在结果中

希望这对其他人也有帮助。

关于javascript - 对象属性的深度过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28682244/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com