从数组中删除对象并不是完全删除项目

Posted

技术标签:

【中文标题】从数组中删除对象并不是完全删除项目【英文标题】:Deleting an object from an array is not completely deleting item 【发布时间】:2014-01-20 10:19:08 【问题描述】:

基本上我有一个复选框列表,我将它们作为复选标记启用并创建一个 plist 文件

结构:-

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<array>
    <dict>
        <key>Personal</key>
        <string>Pizza1</string>
    </dict>
    <dict>
        <key>Medium</key>
        <string>Pizza2</string>
    </dict>
    <dict>
        <key>Large</key>
        <string>Pizza3</string>
    </dict>
</array>
</plist>

并进一步选择相同的项目,我正在撤消复选标记,我正在从数组中删除字典(使用 removeObjectForKey: )并重写 plist 文件。

结构:-

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<array>
    <dict/>
    <dict/>
    <dict/>
</array>
</plist>

所以问题是从数组中删除了对象但字典仍然存在?

如何解决?

【问题讨论】:

为什么是一个包含 3 个字典的数组而不是一个字典? 使用remove object at index解决问题 【参考方案1】:
removeObjectForKey

用于从字典中删除条目。数组没有键,它们有索引

removeObjectAtIndex:

用于从数组中删除一个元素。

您一直在清空字典的内容,而不是删除它。

另外,如果这是你的数据结构,为什么你需要一个字典数组?为什么不只是一本多对的字典?

【讨论】:

【参考方案2】:

***foe 提出的问题是正确的,为什么不使用这样的单一字典...

@
    @"Personal" : @"Pizza1",
    @"Medium" : @"Pizza2",
    @"Large" : @"Pizza3"

在您的 plist 中,它看起来像这样......

<dict>
    <key1>Personal</key1>
    <string1>Pizza1</string1>
    <key2>Medium</key2>
    <string2>Pizza2</string2>
    <key3>Large</key3>
    <string3>Pizza3</string3>
</dict>

但是,您目前正在做的事情很好,但您没有正确看待它。

您当前有一个包含三个字典的数组。每个字典都有一个 key/value pari。

当您执行removeObjectForKey 时,您将获得其中一个字典并删除键/值对。字典仍然存在。

如果您想删除字典,那么您需要执行类似...

[pizzaArray removeObjectAtIndex:theIndexOfThePizza];

这将彻底删除字典。

【讨论】:

【参考方案3】:

当您使用 remove removeObjectForKey 时,它会从字典而不是字典中删除对象,例如,如果您想要一个带有两个对象的字典:

<dict>
    <key>Medium</key>
    <string>Pizza2</string>
    <key>Large</key>
   <string>Pizza3</string>
</dict>

然后你调用 removeObjectForKey:@"Medium" 结果将是:

<dict>
    <key>Large</key>
    <string>Pizza3</string>
</dict>

但是如果你在只有一个对象时调用它,如下例所示,你会从字典中删除对象,但字典仍然存在但为空。

你应该从键中获取对象并调用:

removeObject:

或获取对象的索引并调用:

removeObjectAtIndex

【讨论】:

以上是关于从数组中删除对象并不是完全删除项目的主要内容,如果未能解决你的问题,请参考以下文章

从数组中删除项目(来自 API 的带有 JSON 的 Restkit 项目)

按属性值从数组中删除项目

使用拼接反应本机从数组中删除对象元素

如何删除 Firebase 数据库中数组中的项目?

我的 for 循环没有根据条件删除数组中的项目? Python [重复]

试图从 React 中的对象数组中删除一个项目