(js)如何在迭代值的同时迭代对象

时间:2017-10-13 20:21:24

标签: javascript

enter image description here

抱歉,我是初学者,我可能只是一次性地为这个网站制定了如此多的规则。我基本上试图让这个问题起作用并将问题隔离到第21行。我认为我试图访问对象键的方式是错误的。我只是想说:如果新对象中的对象键存在于原始数组中,则将新值从新对象推送到新数组中。我认为我做的一切都正确,但第21行的部分......无法弄清楚如何让它发挥作用。对不起,如果这篇文章只是愚蠢哈哈。

编辑以添加代码块

function valueReplace(array, obj) {
  var replaced = [];

  for (var i = 0; i < array.length; i += 1) {
    var value = obj[array[i]];

    if (array.indexOf(obj.i) !== -1) {
      replaced.push(value);
    } else {
      replaced.push(array[i]);
    }
  }
  return replaced;
}

2 个答案:

答案 0 :(得分:0)

您有一个混合错误报告,但在实际代码中,您尝试使用不存在的属性iobj.i来访问该对象。详细了解property accessor

为了获得想要的结果,您可以使用in operator来检查对象中的属性是否存在。

if (array[i] in obj) {
     replaced.push(obj[array[i]]);
} else {
    replaced.push(array[i]);
}

答案 1 :(得分:0)

看起来您遇到的一个问题是尝试使用点表示法访问动态属性,JS通常不喜欢这种情况。我颠倒了你的逻辑,因为因为IMO更有意义的是看对象是否具有属性而不是获取属性然后获取数组的索引,但是你可以将其反转回使用索引function valueReplace(array, obj) { let replaced = []; for (let i = 0, len = array.length; i < len; i++) { if (obj.hasOwnProperty(array[i])) { replaced.push(obj[array[i]]); } else { replaced.push(array[i]); } } return replaced; }

const valueReplace = (array, obj) => array.map(val => (obj.hasOwnProperty(val)) ? obj[val] : val);

因为我通常喜欢简化这里的功能,所以使用array.prototype.map在ES6兼容代码中重写了这个功能。不要将它用于做作业,但如果你想要,你可以将它用于标准功能;)。

struct Coordinate: Codable {
    var latitude: Double
    var longitude: Double
    var elevation: Double

    enum CodingKeys: String, CodingKey {
        case latitude
        case longitude
        case additionalInfo
    }

    enum AdditionalInfoKeys: String, CodingKey {
        case elevation
    }

    init(from decoder: Decoder) throws {
        let values = try decoder.container(keyedBy: CodingKeys.self)
        latitude = try values.decode(Double.self, forKey: .latitude)
        longitude = try values.decode(Double.self, forKey: .longitude)

        let additionalInfo = try values.nestedContainer(keyedBy: AdditionalInfoKeys.self, forKey: .additionalInfo)
        elevation = try additionalInfo.decode(Double.self, forKey: .elevation)
    }

    func encode(to encoder: Encoder) throws {
        var container = encoder.container(keyedBy: CodingKeys.self)
        try container.encode(latitude, forKey: .latitude)
        try container.encode(longitude, forKey: .longitude)

        var additionalInfo = container.nestedContainer(keyedBy: AdditionalInfoKeys.self, forKey: .additionalInfo)
        try additionalInfo.encode(elevation, forKey: .elevation)
    }

}