适用于obj和array的函数 - JS

时间:2017-08-06 15:42:24

标签: javascript arrays

我正在编写一个函数,它遍历数组的所有成员,这些成员作为参数传递给函数。阵列的每个成员都将输出到控制台。

然后我需要扩展该函数,以便无论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版本创建此功能。知道我错过了什么吗?我怎么能这样做?

4 个答案:

答案 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))