我正在编写一个函数,它遍历数组的所有成员,这些成员作为参数传递给函数。阵列的每个成员都将输出到控制台。
然后我需要扩展该函数,以便无论ARRAY还是OBJECT作为函数的参数传入它都能工作。这意味着我需要知道如何区分参数是ARRAY还是OBJECT。
目前我正在使用for循环,我也为变体创建了一个forEach版本。
查看我的代码:
@IBAction func payAction(_ sender: Any) {
price = donationAmount.text
print(price)
let request = PKPaymentRequest()
request.merchantIdentifier = applePayMerchantID
request.supportedNetworks = SupportedPaymentNetworks
request.merchantCapabilities = PKMerchantCapability.capability3DS
request.countryCode = "GBR"
request.currencyCode = "GBP"
request.requiredBillingAddressFields = PKAddressField.all
//request.applicationData = "This is a test".dataUsingEncoding(NSUTF8StringEncoding)
let paymentSummary = [PKPaymentSummaryItem(label:"Sponsorship", amount: 10.00)]
request.paymentSummaryItems = paymentSummary
let applePayController: PKPaymentAuthorizationViewController = PKPaymentAuthorizationViewController(paymentRequest: request)
applePayController.delegate = self;
if(applePayController == nil){
print("___")
} else{
self.present(applePayController, animated: true, completion: nil)
}
}
func paymentAuthorizationViewController(_ controller: PKPaymentAuthorizationViewController, didAuthorizePayment payment: PKPayment, completion: @escaping (PKPaymentAuthorizationStatus) -> Void) {
completion(PKPaymentAuthorizationStatus.success)
}
func paymentAuthorizationViewControllerDidFinish(_ controller: PKPaymentAuthorizationViewController) {
controller.dismiss(animated: true, completion: nil)
}
这里的一个大问题是,当我传入obj时它不会返回任何内容,并且会在ES5和ES6版本上返回错误。无论是将ARRAY还是OBJECT作为参数传入函数,这都应该有效。这意味着我需要知道如何区分参数是ARRAY还是OBJECT。
根据它是什么,然后需要适当地处理它们并将数组或对象的内容输出到控制台。我需要为ES5和ES6版本创建此功能。知道我错过了什么吗?我怎么能这样做?
答案 0 :(得分:3)
你可以使用for (variable in object) {
function iterateMembers(arg){
for(var key in arg)
console.log(arg[key]);
}
let arr = ['sam', 12, 'norton', 15];
let obj = {
firstname: 'sam',
lastname: 'norton',
age: 21
};
iterateMembers(arr);
iterateMembers(obj);
答案 1 :(得分:2)
您可以迭代对象或数组的键。
function iterate(object) {
return Object.keys(object).map(k => object[k]);
}
let array = ['sam', 12, 'norton', 15];
let object = { firstname: 'sam', lastname: 'norton', age: 21 };
console.log(...iterate(array));
console.log(...iterate(object));
答案 2 :(得分:2)
您可以检查传递给iterateMembers函数的对象的构造函数,并使用if语句来区分这两者:
function iterateMembers(arg) {
if(arg.constructor === Array) {
for(var i=0;i<arg.length;i++) {
var element = arg[i];
console.log(element);
}
} else {
for(var i=0;i<Object.keys(arg).length;i++) {
var index = Object.keys(arg)[i];
var element = arg[index];
console.log(element);
}
}
}
var obj = {'key1': 'val1', 'key2': 'val2', 'key3': 'val3'};
var arr = ['key1', 'key2', 'key3'];
iterateMembers(arr);//Outputs key1, key2, key3
iterateMembers(obj);//Outputs val1, val2, val3
答案 3 :(得分:1)
为了区分数组和对象,你可以看到这个答案:Check if object is array?
为了迭代OBJECT键/值,您可以使用:
iterateMembers(Object.keys(obj))
or
iterateMembers(Object.values(obj))