Как отфильтровать массив объектов?

332
11 июля 2017, 23:19
<ui_graph_search :values="getStatus" @select="changeArray('status_id', 'where', $event)" :multiple="true">Статус</ui_graph_search>
<ui_chip removeByCallback v-for="selected in filterArray.status_id" @delete="removeFromWhereIn('status_id', 'where', $event)" :item="selected">{{ selected.name }}</ui_chip>

changeArray(name, subname, value) {
    if (this.filterArray[name].length < 2) {
        this.filterArray[name].push(value)
        var filterId = this.filterArray[name].map((item)=>{
            return item.id
        })
        var i = filterId.length,
            result = [];
        while(i--) {
            if (result.join('').search(filterId[i]) == '-1') {
                result.push(filterId[i])
            }
        }
        this.$store.dispatch('table/updateFilter', { name: name, subname: subname, value: result});
    }
},

В filterArray.status_id при выборе двух одинаковых статусов падают одинаковые объекты.

Подскажите, как отфильтровать массив объектов так, чтобы, если вдруг у объекта совпадает id, он не добавлялся.

Не понимаю в какой момент времени все это происходит.

UPDATE: на выходе например получается вот такая конструкция

[obj, obj1, obj2]
obj = {
    id: 222
},
obj1 = {
    id: 333
},
obj2 = {
    id: 222
}

А нужно отфильтровать массив, чтобы на выходе было [obj, obj1]

Answer 1

Если после map(item => item.id) выходит такое [{id:222},{id:333}, ...], то значит filterArray[name] у вас такой конструкции -

[
  {id: {id: 444}},  
  {id: {id: 333}},  
  {id: {id: 222}}
]

А result.join('') дает такую строку - "[object Object][object Object][object Object]" и неудивительно, что ничего не фильтруется.

console.log([{id:222},{id:333},{id:444}].join(''))

Чтобы найти дубли, я заменил вашу конструкцию -

result.join('').search(filterId[i]) == '-1'

на

!result.find(el => el.id ==filterId[i].id)

const filterArray = [[ { id: {id: 222}}]]; 
 
function changeArray(name, subname, value) { 
    if (filterArray[name].length < 2) { 
        filterArray[name].push(...value); 
        var filterId = filterArray[name].map(item => item.id); 
         
        var i = filterId.length, 
            result = []; 
        while(i--) 
            if (!result.find(el => el.id ==filterId[i].id)) 
                result.push(filterId[i]); 
         
        console.log({name, subname, value: result}); 
        // this.$store.dispatch('table/updateFilter', { name: name, subname: subname, value: result}); 
   } 
} 
 
changeArray(0 ,2, [{id:{id:444}},  { id: {id: 333}},  { id: {id: 222}}]);

READ ALSO
Доступ к компонентам react

Доступ к компонентам react

Как можно протестировать react компонент, пытаюсь создать класс things который наследуется от const MapServ, нет доступа к testMethod , getPage ни в переменной...

363
когда лучше писать is Requiredв пропсах а когда defaultprops?

когда лучше писать is Requiredв пропсах а когда defaultprops?

когда лучше писать isRequired в пропсах а когда defaultprops?

237
Повторные AJAX запросы JQ-JS

Повторные AJAX запросы JQ-JS

Суть такова, к примеру есть функция которая делает запрос на сервер для генерации ссылки по последующим запуском этой ссылки в плеереНу есть...

360
jquery.balloon.js: выводить contents+title

jquery.balloon.js: выводить contents+title

Как используя jqueryballoon

259