1

Тема: JS - чи правильно так робити ?

Потрібно з масиву об’єктів отримати set .

Наскільки коректне таке рішення? Бо готового методу чи функції щось не зміг нагуглити.

            for (var d in data) {
                var new_receiver = JSON.stringify({'id': data[d]['receiver_id'], 'name': data[d]['receiver']});
                if ($scope.receivers.indexOf(new_receiver) == -1) {
                    $scope.receivers.push(new_receiver);
                }
            }
            for (var d in data) {
                $scope.receivers[d] = JSON.parse($scope.receivers[d]);
            }

2 Востаннє редагувалося koala (26.02.2017 08:09:46)

Re: JS - чи правильно так робити ?

Є така експерементальна фіча: https://developer.mozilla.org/ru/docs/W … bjects/Set

А ваше рішення, можливо, трохи нефективне через роботу зі стрічками, але чому б ні, якщо воно вас влаштовує?

Подякували: 221VOLT1

3 Востаннє редагувалося ping (26.02.2017 08:43:14)

Re: JS - чи правильно так робити ?

koala написав:

Є така експерементальна фіча: https://developer.mozilla.org/ru/docs/W … bjects/Set

А ваше рішення, можливо, трохи нефективне через роботу зі стрічками, але чому б ні, якщо воно вас влаштовує?

я пробував цей спосіб, але чомусь отримав(приклад коду з консолі браузера):

s=New set([{'1':'2'}, {'1':'2'},{'2':'5'}]);
SyntaxError: missing ; before statement

може треба щось додатково підключити?

4

Re: JS - чи правильно так робити ?

Треба:
- не плутати регістри;
- не пхати туди об'єкти: вони порівнюються не за значенням, а за адресою, і {'1':'2'} та {'1':'2'} - різні екземпляри.

А що в data[d]['receiver_id'] та data[d]['receiver'] знаходиться?

Подякували: 221VOLT1

5

Re: JS - чи правильно так робити ?

Так, стоп. Ви спершу пхаєте все в JSON, а потім в об'єкт (він же асоціативний масив), так? А що заважає це робити одразу?

Подякували: 221VOLT1

6 Востаннє редагувалося ping (26.02.2017 09:21:57)

Re: JS - чи правильно так робити ?

koala написав:

Треба:
- не плутати регістри;
- не пхати туди об'єкти: вони порівнюються не за значенням, а за адресою, і {'1':'2'} та {'1':'2'} - різні екземпляри.

А що в data[d]['receiver_id'] та data[d]['receiver'] знаходиться?

- РЕГІСТРИ!!!!  *WALL*

- так мені саме об’єкти і потрібно опрацювати

data
Array [ Object, Object, Object, Object ]
data[0]
Object { user: 1, id: 3, subject: "2 worker not", body: "body worker not", receiver_email: "se@sdd.sd", receiver: "worker worker", receiver_id: 1 }
data[1]
Object { user: 1, id: 4, subject: "1 worker not", body: "body worker not", receiver_email: "se@sdd.sd", receiver: "work 33 last name work 33", receiver_id: 3 }
data[2]
Object { user: 1, id: 5, subject: "3 worker not", body: "body worker not", receiver_email: "se@sdd.sd", receiver: "worker 22 last name worker 22", receiver_id: 2 }
data[3]
Object { user: 1, id: 6, subject: "2 worker not", body: "body worker not", receiver_email: "se@sdd.sd", receiver: "worker worker", receiver_id: 1 }

робиться випадаючий фільтр по отримувачах ( data[d]['receiver_id'] та data[d]['receiver'] ) і для нього я формую set, щоб не було дублів

7

Re: JS - чи правильно так робити ?

koala написав:

Так, стоп. Ви спершу пхаєте все в JSON, а потім в об'єкт (він же асоціативний масив), так? А що заважає це робити одразу?

сервер формує вибірку повідомлень для  receivers, але далі треба фільтр по них.

8 Востаннє редагувалося koala (26.02.2017 09:34:35)

Re: JS - чи правильно так робити ?

Ну так, виглядає, що JSON - найкоротший спосіб порівнювати об'єкти (якщо вони сформовані в одному порядку, бо {'a':1,'b':2} і {'b':2,'a':1} дають різні JSON-и).
А от множини формувати можна і без parse:

var temp_obj = {};
for (var d in data) {
    var obj = {'id': data[d]['receiver_id'], 'name': data[d]['receiver']};
    temp_obj[JSON.stringify(obj)]={'index':d,'value':obj}; //унікальність ключа гарантовано
}
for(var obj in temp_obj) {
    $scope.receivers[obj.index] = obj.value;
}
Подякували: 221VOLT, ping2

9

Re: JS - чи правильно так робити ?

Мабуть вам краще підійде Map() - ще одна нова фіча ES2015+ (як мінімум у Google Chrome вона підтримується):

$scope.receivers = new Map;

for(let d in data)
{
  $scope.receivers.set( data[d]['receiver_id'], data[d]['receiver'] );
}

// Використання
$scope.receivers.forEach( (name, id)=>
{
  // Робите щось з name, id
});