如何将值与 NSdictionary 的相似键合并
How to merge values with similar keys for NSdictionary
你好,我有这样的情况,我得到了这样的服务器原始响应
(
{
"Nov 2018" = {
AudioFileURL = "https://www.GeorgeA.m4a";
AudioFileText = "GeorgeA";
};
},
{
"Nov 2018" = {
AudioFileURL = "https://www.GeorgeB.m4a";
AudioFileText = "Georgeb";
};
},
{
"Nov 2018" = {
AudioFileURL = "https://www.Georgec.m4a";
AudioFileText = "Georgec";
};
},
{
"Sep 2018" = {
AudioFileURL = "https://www.GeorgeB.m4a";
AudioFileText = "GeorgeD";
};
}
)
现在我想将所有值与相同的键结合起来,以便我可以在 UITableView 控制器的部分中使用它们。有人可以为此提供一些指导吗?
我正在寻找的输出是这样的
(
{
"Nov 2018" = {
[AudioFileURL = "https://www.GeorgeA.m4a";
AudioFileText = "GeorgeA"],
[AudioFileURL = "https://www.GeorgeB.m4a";
AudioFileText = "GeorgeB"],
[AudioFileURL = "https://www.GeorgeC.m4a";
AudioFileText = "GeorgeC"];
};
},
{
"Sep 2018" = {
[AudioFileURL = "https://www.GeorgeB.m4a";
AudioFileText = "GeorgeD";]
};
}
)
首先制作一个结构,在一个单元格中表示您想要的信息:
struct AudioFileInfo {
let urlString: String
let text: String
init(dict: [String: String]) {
urlString = dict["AudioFileURL"] ?? ""
text = dict["AudioFileText"] ?? ""
}
}
struct CellInfo {
let date: String
let audioFileInfos: [AudioFileInfo]
}
那么您可以:
let cellInfos = response
.flatMap {
[=11=].map { ([=11=].key, AudioFileInfo(dict: [=11=].value)) }
}
.reduce([CellInfo]()) { partial, item in
var new = partial
if let index = partial.index(where: { [=11=].date == item.0 }) {
new[index] = CellInfo(date: partial[index].date, audioFileInfos: partial[index].audioFileInfos + [item.1])
}
else {
new.append(CellInfo(date: item.0, audioFileInfos: [item.1]))
}
return new
}
这将为您提供一组 CellInfo 对象。
一般来说,这就是您解决此类问题的方式。首先定义一个表示所需输出的类型,然后操作输入,直到创建该类型的对象。 Playground 是这类事情的朋友。
这样的东西对你有用
typealias AudioFile = (url: String, text: String)
class DictArray {
var items: [MainModal]
class MainModal {
let date: String
var files: [AudioFile]
init(key: String, file: AudioFile) {
self.key = key
self.files = [file]
}
}
init(dictArray: [[String: [String: String]]]) {
for dict in dictArray {
if let date = dict.keys.first {
if let item = items.first(where: { [=10=].date == date }) {
guard let value = dict.values.first as? [String: String] else { continue }
let file = AudioFile(url: value["AudioFileURL"]!, text: value["AudioFileText"]!)
item.files.append(file)
} else {
guard let value = dict.values.first as? [String: String] else { continue }
let file = AudioFile(url: value["AudioFileURL"]!, text: value["AudioFileText"]!)
items.append(MainModal(key: date, files: [file]))
}
}
}
}
}
DictArray(dict: json)
你好,我有这样的情况,我得到了这样的服务器原始响应
(
{
"Nov 2018" = {
AudioFileURL = "https://www.GeorgeA.m4a";
AudioFileText = "GeorgeA";
};
},
{
"Nov 2018" = {
AudioFileURL = "https://www.GeorgeB.m4a";
AudioFileText = "Georgeb";
};
},
{
"Nov 2018" = {
AudioFileURL = "https://www.Georgec.m4a";
AudioFileText = "Georgec";
};
},
{
"Sep 2018" = {
AudioFileURL = "https://www.GeorgeB.m4a";
AudioFileText = "GeorgeD";
};
}
)
现在我想将所有值与相同的键结合起来,以便我可以在 UITableView 控制器的部分中使用它们。有人可以为此提供一些指导吗?
我正在寻找的输出是这样的
(
{
"Nov 2018" = {
[AudioFileURL = "https://www.GeorgeA.m4a";
AudioFileText = "GeorgeA"],
[AudioFileURL = "https://www.GeorgeB.m4a";
AudioFileText = "GeorgeB"],
[AudioFileURL = "https://www.GeorgeC.m4a";
AudioFileText = "GeorgeC"];
};
},
{
"Sep 2018" = {
[AudioFileURL = "https://www.GeorgeB.m4a";
AudioFileText = "GeorgeD";]
};
}
)
首先制作一个结构,在一个单元格中表示您想要的信息:
struct AudioFileInfo {
let urlString: String
let text: String
init(dict: [String: String]) {
urlString = dict["AudioFileURL"] ?? ""
text = dict["AudioFileText"] ?? ""
}
}
struct CellInfo {
let date: String
let audioFileInfos: [AudioFileInfo]
}
那么您可以:
let cellInfos = response
.flatMap {
[=11=].map { ([=11=].key, AudioFileInfo(dict: [=11=].value)) }
}
.reduce([CellInfo]()) { partial, item in
var new = partial
if let index = partial.index(where: { [=11=].date == item.0 }) {
new[index] = CellInfo(date: partial[index].date, audioFileInfos: partial[index].audioFileInfos + [item.1])
}
else {
new.append(CellInfo(date: item.0, audioFileInfos: [item.1]))
}
return new
}
这将为您提供一组 CellInfo 对象。
一般来说,这就是您解决此类问题的方式。首先定义一个表示所需输出的类型,然后操作输入,直到创建该类型的对象。 Playground 是这类事情的朋友。
这样的东西对你有用
typealias AudioFile = (url: String, text: String)
class DictArray {
var items: [MainModal]
class MainModal {
let date: String
var files: [AudioFile]
init(key: String, file: AudioFile) {
self.key = key
self.files = [file]
}
}
init(dictArray: [[String: [String: String]]]) {
for dict in dictArray {
if let date = dict.keys.first {
if let item = items.first(where: { [=10=].date == date }) {
guard let value = dict.values.first as? [String: String] else { continue }
let file = AudioFile(url: value["AudioFileURL"]!, text: value["AudioFileText"]!)
item.files.append(file)
} else {
guard let value = dict.values.first as? [String: String] else { continue }
let file = AudioFile(url: value["AudioFileURL"]!, text: value["AudioFileText"]!)
items.append(MainModal(key: date, files: [file]))
}
}
}
}
}
DictArray(dict: json)