Как найти значение в массиве с использованием ионной 4? - PullRequest
0 голосов
/ 20 мая 2019

Я работаю над приложением для оповещения имени вызывающего абонента, для этого приложения я сохранил контакт в локальном хранилище и получаю значение контакта в массиве.Почему я это делаю, потому что, когда кто-то звонит мне, нужно время, чтобы найти контакт.Поэтому мой старший предлагает мне хранить его в локальном хранилище, и когда он получает вызов, он находит его в локальном хранилище, поэтому он работает быстро, а затем рано.Для этого я сделал этот код, пожалуйста, помогите мне, если это возможно.

Я использую этот плагин: контакты

declare var window: any;

setContacts() {
const options = new ContactFindOptions();
options.filter = "";
options.multiple = true;
options.hasPhoneNumber = true;

this.contact.find(['*'], options).then((contacts) => {
    this.ArrayData = contacts;
    this.storage.set("mycontactsdata", this.ArrayData);
    console.log("stringify contact all", JSON.stringify(this.ArrayData));
});
var testobj = JSON.stringify(this.ArrayData);
localStorage.setItem("testobjdata", testobj);
}

phonecalls() {
if (window.PhoneCallTrap) {
    window.PhoneCallTrap.onCall((obj) => {
        var callObj = JSON.parse(obj),
            state = callObj.state,
            callingNumber = callObj.incomingNumber;
        if (callingNumber > 0) {
            var resultdata = localStorage.getItem("testobjdata");
            if (resultdata) {
                this.ArrayData1 = JSON.parse(resultdata);
            }
            this.ArrayData1.forEach(function (item) {
                console.log(item.displayName);
                if (item._objectInstance.phoneNumbers[0] == callingNumber) {
                    console.log("found");
                    this.contactsfoundcallingNumber = item._objectInstance.displayName;
                    console.log(this.contactsfoundcallingNumber);
                }
            });
        }
    });
}
}

Структура значения в локальном хранилище

[
{ "_objectInstance": 
{ 
    "id": "1", 
    "rawId": null, 
    "displayName": "Test contact name", 
    "name": { 
        "familyName": "Test", 
        "givenName": "Test", 
        "middleName": "Test", 
        "formatted": "Test Test Test" 
    }, 
        "nickname": null, 
        "phoneNumbers": [
            { 
                "id": "56", 
                "pref": false, 
                "value": "+91 xxxxx xxxxx", 
                "type": "mobile" 
            }, 
            { 
                "id": "192394", 
                "pref": false, 
                "value": "+91xxxxxxxxxx", 
                "type": "mobile" 
            }, 
            {
                "id": "201516", 
                "pref": false, 
                "value": "+91 xxxxx xxxxx", 
                "type": "mobile" 
            }
        ], 
        "emails": null, 
        "addresses": null, 
        "ims": null, 
        "organizations": null, 
        "birthday": "xxxx-xx-xxT18:30:00.000Z", 
        "note": null, 
        "photos": [
            { 
                "id": "193840", 
                "pref": false, 
                "type": "url", 
                "value": "content://com.android.contacts/contacts/1/photo" 
            }
        ], 
        "categories": null, 
        "urls": null 
    }, "rawId": "8" 
}, 
]

когда я использую отладчик и инспектирую в chrome, инспектирую с помощью отладки USB, я получаю эту ошибку и элемент, используемый в функции forEach.

message: "item is not defined"
stack: "ReferenceError: item is not defined↵    at eval (eval at <anonymous> (http://localhost/pages-home-home-module.js:411:21), <anonymous>:1:1)↵    at http://localhost/pages-home-home-module.js:411:21↵    at Object.callbackFromNative (http://localhost/cordova.js:291:58)↵    at <anonymous>:1:9"
__proto__: Error

Ответы [ 2 ]

1 голос
/ 20 мая 2019

На самом деле существует проблема при получении данных на хранение var resultdata = localStorage.getItem("testobjdata");

Вышеописанное не будет работать, так как для доступа к памяти и получения данных требуется время, поэтому getItem() вернет обещание. Для его решения необходимо сделать это следующим образом:

let resultdata = [];
localStorage.getItem("testobjdata").then(data => resultData = data);

обратите внимание, что, поскольку javascript работает с одним потоком, любая функция или любое использование переменной resultData до then() будет избыточным

см. Хранение Документация

0 голосов
/ 20 мая 2019

Просто попробуйте:

let indexOfCallingNum = this.ArrayData1.indexOf(callingNumber);
console.log("Got it : "+JSON.stringify(this.ArrayData1[indexOfCallingNum])); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...