我有下面的字典代码
var dic : [String: AnyObject] = ["FirstName": "Anvar", "LastName": "Azizov", "Website": NSNull(),"About": NSNull()]
我已经使用下面的代码
删除了具有空值的键var keys = dic.keys.array.filter({dic[$0] is NSNull})
for key in keys {
dic.removeValueForKey(key)
}
它适用于静态字典,但我想动态地做,我想用函数完成它但是每当我将字典作为参数传递时它就像一个let意味着常量,所以不能删除null键 我在下面编写代码
func nullKeyRemoval(dic : [String: AnyObject]) -> [String: AnyObject]{
var keysToRemove = dic.keys.array.filter({dic[$0] is NSNull})
for key in keysToRemove {
dic.removeValueForKey(key)
}
return dic
}
请告诉我这个解决方案
答案 0 :(得分:12)
不是使用全局函数(或方法),为什么不使用扩展名将其作为Dictionary
的方法?
extension Dictionary {
func nullKeyRemoval() -> Dictionary {
var dict = self
let keysToRemove = Array(dict.keys).filter { dict[$0] is NSNull }
for key in keysToRemove {
dict.removeValue(forKey: key)
}
return dict
}
}
它适用于任何泛型类型(不限于String, AnyObject
),您可以直接从字典本身调用它:
var dic : [String: AnyObject] = ["FirstName": "Anvar", "LastName": "Azizov", "Website": NSNull(),"About": NSNull()]
let dicWithoutNulls = dic.nullKeyRemoval()
答案 1 :(得分:3)
对于add_action( 'template_redirect', 'redirect_to_homepage' );
function redirect_to_homepage() {
$homepage_id = get_option('page_on_front')
if ( ! is_page( $homepage_id ) ) {
wp_redirect( home_url( 'index.php?page_id=' . $homepage_id ) );
}
}
,这可能会有所帮助。同时删除递归的render() {
return (
<div ref="root" className={s.root}>
// ----
</div>
)};
onChange(state) {
if(this.refs.root) {
this.setState(state);
}
}
个对象:
Swift 3.0 / 3.1
答案 2 :(得分:1)
Swift 3:从词典中删除null
func removeNSNull(from dict: [String: Any]) -> [String: Any] {
var mutableDict = dict
let keysWithEmptString = dict.filter { $0.1 is NSNull }.map { $0.0 }
for key in keysWithEmptString {
mutableDict[key] = ""
}
return mutableDict
}
使用强>:
let outputDict = removeNSNull(from: ["name": "Foo", "address": NSNull(), "id": "12"])
输出:[“name”:“Foo”,“address”:“”,“id”:“12”]
答案 3 :(得分:0)
不是使用全局函数(或方法),为什么不使用扩展名将其作为Dictionary的方法呢?
extension NSDictionary
{
func RemoveNullValueFromDic()-> NSDictionary
{
let mutableDictionary:NSMutableDictionary = NSMutableDictionary(dictionary: self)
for key in mutableDictionary.allKeys
{
if("\(mutableDictionary.objectForKey("\(key)")!)" == "<null>")
{
mutableDictionary.setValue("", forKey: key as! String)
}
else if(mutableDictionary.objectForKey("\(key)")!.isKindOfClass(NSNull))
{
mutableDictionary.setValue("", forKey: key as! String)
}
else if(mutableDictionary.objectForKey("\(key)")!.isKindOfClass(NSDictionary))
{
mutableDictionary.setValue(mutableDictionary.objectForKey("\(key)")!.RemoveNullValueFromDic(), forKey: key as! String)
}
}
return mutableDictionary
}
}
答案 4 :(得分:0)
Swift 4
比其他解决方案更有效率。仅使用O(n)
复杂度。
extension Dictionary where Key == String, Value == Any? {
var trimmingNullValues: [String: Any] {
var copy = self
forEach { (key, value) in
if value == nil {
copy.removeValue(forKey: key)
}
}
return copy as [Key: ImplicitlyUnwrappedOptional<Value>]
}
}
Usage: ["ok": nil, "now": "k", "foo": nil].trimmingNullValues // =
["now": "k"]
如果您的字典是可变的,您可以在适当的位置执行此操作并防止低效复制:
extension Dictionary where Key == String, Value == Any? {
mutating func trimNullValues() {
forEach { (key, value) in
if value == nil {
removeValue(forKey: key)
}
}
}
}
Usage:
var dict: [String: Any?] = ["ok": nil, "now": "k", "foo": nil]
dict.trimNullValues() // dict now: = ["now": "k"]
答案 5 :(得分:0)
使用reduce
的Swift 4示例let dictionary = [
"Value": "Value",
"Nil": nil
]
dictionary.reduce([String: String]()) { (dict, item) in
guard let value = item.value else {
return dict
}
var dict = dict
dict[item.key] = value
return dict
}
答案 6 :(得分:0)
最干净的方法,只有1行
extension Dictionary {
func filterNil() -> Dictionary {
return self.filter { !($0.value is NSNull) }
}
}
答案 7 :(得分:0)
Swift 5添加compactMapValues(_:)
,让您可以这么做
let filteredDict = dict.compactMapValues { $0 is NSNull ? nil : $0 }
答案 8 :(得分:0)
NSNull
要删除任何嵌套级别(包括数组和字典)中的任何 NSNull
外观,请尝试以下操作:
extension Dictionary where Key == String {
func removeNullsFromDictionary() -> Self {
var destination = Self()
for key in self.keys {
guard !(self[key] is NSNull) else { destination[key] = nil; continue }
guard !(self[key] is Self) else { destination[key] = (self[key] as! Self).removeNullsFromDictionary() as? Value; continue }
guard self[key] is [Value] else { destination[key] = self[key]; continue }
let orgArray = self[key] as! [Value]
var destArray: [Value] = []
for item in orgArray {
guard let this = item as? Self else { destArray.append(item); continue }
destArray.append(this.removeNullsFromDictionary() as! Value)
}
destination[key] = destArray as? Value
}
return destination
}
}