基本上,我有一个如下所示的JavaScript数组:
var keyFilters = ["key_1", "key_2", "key_3"];
我有一个看起来像这样的对象:
myObject["key_1"] = "Value 1";
myObject["key_2"] = "Value 2";
myObject["key_random"] = "Value 2";
我需要将myObject
对象配对,才能拥有keyFilters
数组中存在的密钥。有时,对象不会有过滤器中存在的密钥。在此示例中,针对myObject
过滤keyFilters
将导致此输出对象:
myObject = {
"key_1": "Value 1",
"key_2": "Value 2",
}
我知道JS中的对象没有map
函数,但是有一个用于数组。最好是使用它还是只编写一个单一的函数来迭代数组然后遍历对象,并推送到只有匹配键的新对象,或者是否有一些更流畅的方式?
答案 0 :(得分:3)
for (i in myObject) if (keyFilters.indexOf(i) < 0) delete myObject[i];
答案 1 :(得分:0)
Underscore.js有很好的实现。 https://github.com/jashkenas/underscore/blob/master/underscore.js#L1108
// Return a copy of the object only containing the whitelisted properties.
_.pick = restArgs(function(obj, keys) {
var result = {}, iteratee = keys[0];
if (obj == null) return result;
if (_.isFunction(iteratee)) {
if (keys.length > 1) iteratee = optimizeCb(iteratee, keys[1]);
keys = _.allKeys(obj);
} else {
iteratee = keyInObj;
keys = flatten(keys, false, false);
obj = Object(obj);
}
for (var i = 0, length = keys.length; i < length; i++) {
var key = keys[i];
var value = obj[key];
if (iteratee(value, key, obj)) result[key] = value;
}
return result;
});
答案 2 :(得分:0)
我知道JS中的对象没有map函数,但是有一个用于数组。最好是使用它还是只编写一个单一的函数来迭代数组然后遍历对象,并推送到只有匹配键的新对象,或者是否有一些更流畅的方式?
是的,但您可以映射Object
的{{1}}:
keys
我希望这适合你!
答案 3 :(得分:0)
如果要根据数据返回新对象,请使用:
let keyFilters = ["key_1", "key_2", "key_3"];
let myObject = {};
myObject["key_1"] = "Value 1";
myObject["key_2"] = "Value 2";
myObject["key_random"] = "Value 2";
let newObject = Object.keys(myObject)
.filter((key) => keyFilters.includes(key))
.map((key) => {
return {[key]: myObject[key]}
})
.reduce((a, b) => Object.assign({}, a,b));
有:
1)仅过滤包含的键(作为数组)
2)通过它们进行映射并创建键值对的新对象(作为数组)
3)将映射的数组减少为单个对象
答案 4 :(得分:0)
迭代Object的键,然后使用includes
方法查找数组中的键,如果它不存在,则删除它。
var safe_keys = ["key_1", "key_2", "key_3"],
obj = {
'key_1': 'Value 1',
'key_2': 'Value 2',
'key_random': 'Value 2'
};
for (let key of Object.keys(obj))
!safe_keys.includes(key) && delete obj[key];
console.log(obj);