Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 如何转换对象数组中的值_Arrays_Json_Swift_Dictionary - Fatal编程技术网

Arrays 如何转换对象数组中的值

Arrays 如何转换对象数组中的值,arrays,json,swift,dictionary,Arrays,Json,Swift,Dictionary,给定此值数组: let values = [ ["2020-01-01", 1, 3, 2], ["2020-02-01", 10, 30, 20], ["2020-03-01", 100, 300, 200] ] 我怎样才能把它转换成这样的东西 public struct Point { var date: String var price: Double } let expectedRes

给定此值数组:

let values = [
    ["2020-01-01", 1, 3, 2],
    ["2020-02-01", 10, 30, 20],
    ["2020-03-01", 100, 300, 200]
]
我怎样才能把它转换成这样的东西

public struct Point {
    var date: String
    var price: Double
}

let expectedResult: [[Point]] = [
    [Point(date: "2020-01-01", price: 1), Point(date: "2020-02-01", price: 10), Point(date: "2020-03-01", price: 100)],
    [Point(date: "2020-01-01", price: 3), Point(date: "2020-02-01", price: 30), Point(date: "2020-03-01", price: 300)],
    [Point(date: "2020-01-01", price: 2), Point(date: "2020-02-01", price: 20), Point(date: "2020-03-01", price: 200)]
]
我希望值总是有1个字符串和不同数量的双精度,因此我需要为每个双精度设置一个点数组

我尝试过使用.map或嵌套for循环的不同方法,但我从未达到预期的结果,或者我最终得到了一个很难阅读的代码。

您可以这样做:

import UIKit

let values = [
    ["2020-01-01", 1.0, 3.0, 2.0],
    ["2020-02-01", 10.0, 30.0, 20.0],
    ["2020-03-01", 100.0, 300.0, 200.0]
]

public struct Point {
    var date: String
    var price: Double
}

var expectedResult: [[Point]] = []

for i in 1..<values[0].count {
    var points: [Point] = []
    for j in 0..<values.count {
        points.append(Point(date: values[j][0] as! String, price: values[j][i] as! Double))
    }
    expectedResult.append(points)
}

print(expectedResult)
导入UIKit
设值=[
["2020-01-01", 1.0, 3.0, 2.0],
["2020-02-01", 10.0, 30.0, 20.0],
["2020-03-01", 100.0, 300.0, 200.0]
]
公共结构点{
变量日期:字符串
var价格:双倍
}
var expectedResult:[[点]]=[]

对于1中的i..来说,输入确实很可疑(
[Any]
从来都不是一件有趣的事情,你应该尽量避免),但你所需要的只是两个简单的
映射

let values = [
    ["2020-01-01", 1, 3, 2],
    ["2020-02-01", 10, 30, 20],
    ["2020-03-01", 100, 300, 200]
]

public struct Point {
    var date: String
    var price: Double
}

let points: [[Point]] = values.map { pointData in
    let date = pointData.first! as! String // You REALLY should parse this into a `Date`.
    let prices = pointData.dropFirst()
    
    return prices.map { Point(date: date, price: Double($0 as! Int)) }
}

points.forEach { print($0) }

那些显式的
for
循环可以被一个简单的
映射和
平面映射所代替。一个
字符串
不是一个
日期
。您应该使用
日期
。您还应该小心使用
Double
作为货币,因为它可能会给您带来意想不到的结果。是的,我没有使用字符串或双精度,我只是把它们放在这里以保持示例的简单性,示例中的字符串也可以是“A”、“B”、“C”好的很好,只是检查一下。这不会给出预期的结果,例如,第一个数组最终是:
[Point(日期:“2020-01-01”,价格:1),Point(日期:“2020-01-01”,价格:3),Point(日期:“2020-01-01”,价格:2)]
而不是
[点(日期:“2020-01-01”,价格:1),点(日期:“2020-02-01”,价格:10),点(日期:“2020-03-01”,价格:100)]
听起来你只需要转置结果。现在更奇怪的是,你的分组是这样的,模式是什么?基本上,
值中的每个数组都包含制作3个图表所需的点。例如:
[“2020-01-01”,1,3,2]
“2020-01-01”
是X轴上的点,
1
将是第一张图表Y轴上的点,
3
2
是具有相同X轴值的其他两张图表的Y点。这就是为什么我需要它最终成为3个不同的数组来制作3个不同的图表。它比需要的要复杂得多,但我在我获取这些值的方式上没有发言权,所以我必须坚持这种方法。嗯,转置将完成这项工作。