Фильтровать массив объектов на основе поля в каждом объекте - PullRequest
0 голосов
/ 04 января 2019

Допустим, у меня есть массив таких объектов:

[
  { "type": 121, "model": "model1" },
  { "type": 128, "model": "model2" },
  { "type": 130, "model": "model2" },
  { "type": 130, "model": "model2" }
]

И я хочу отфильтровать его и создать новые объекты на основе поля модель .

С конечным результатом:

[
  { "type": 121, "model": "model1" }
]

[
  { "type": 128, "model": "model2" },
  { "type": 130, "model": "model2" },
  { "type": 130, "model": "model2" }
]

Я использую машинопись и lodash, поэтому все, что с этим было бы лучше

Я пробовал lodash groupBy и ES6 mapping, но пока безуспешно,Я думаю, что мог бы сделать это грязным способом с несколькими циклами forEach, но я уверен, что есть гораздо более простой способ.

Ответы [ 6 ]

0 голосов
/ 04 января 2019

попробуйте это @ raulicious,

var arrayList= [
  { "type": 121, "model": "model1" },
  { "type": 128, "model": "model2" },
  { "type": 130, "model": "model2" },
  { "type": 131, "model": "model2" }
];


   var filteredArray = [];
   var filtered = [];
   
   arrayList.sort((a, b) => {
         if(a.model == b.model) {
             filtered.push(b);
         } else {
             filtered.push(b);
             filteredArray.push(filtered);
             filtered = [];
           }
       filtered.push(a);
       filteredArray.push(filtered);
     });
    console.log(filteredArray);

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

0 голосов
/ 04 января 2019

Вы можете использовать метод Array.prototype.reduce для группировки всех.

let array = [
  { "type": 121, "model": "model1" },
  { "type": 128, "model": "model2" },
  { "type": 130, "model": "model2" },
  { "type": 130, "model": "model2" }
]

let all = [...array.reduce((acc, curr) => {
  acc.has(curr.model) ? acc.set(curr.model, [...acc.get(curr.model), curr]): acc.set(curr.model, [curr]);
  return acc;
}, new Map()).values()];
console.log(...all)
0 голосов
/ 04 января 2019

Смотрите, если это поможет с lodash

var data = [
  { "type": 121, "model": "model1" },
  { "type": 128, "model": "model2" },
  { "type": 130, "model": "model2" },
  { "type": 130, "model": "model2" }
];

var grouped = _.groupBy(data, function(item) {
  return item.model;
});

console.log(grouped);
<script src='https://cdn.jsdelivr.net/lodash/4.17.2/lodash.min.js'></script>
0 голосов
/ 04 января 2019

Вы могли бы так что-то подобное, например :) В этом случае я создаю карту, я думаю, что это проще для поиска

var newData = new Map([]);

var originalData = [{"type": 130, "model": "model1"}, {"type": 130, "model": "model2"}];
var formattedData = originalData.map(obj => { 
  newData[obj.model].push(obj.type); 
});

Вы получите что-то вроде:

newData = ([
    [ "model1", "130" ],
    [ "model1", "128" ],
    [ "model2", "3" ]
]);

И вы можете получить любые значения, используя ключ модели newData ["model2"] = ["3"]

0 голосов
/ 04 января 2019

Вы можете просто использовать Array.filter функцию для фильтрации массива до нового объекта массива. Здесь я использую переменную searchModels, в которой будет список моделей, которые вы хотите отфильтровать, и внутри фильтра я проверяю условие searchModels.indexOf(item.model) для проверки значения модели.

var array = [
  { "type": 121, "model": "model1" },
  { "type": 128, "model": "model2" },
  { "type": 130, "model": "model2" },
  { "type": 130, "model": "model2" }
];


var searchModels = ['model1', 'model3'];
var filteredArray = array.filter((item) => { return searchModels.indexOf(item.model) !== -1 });
console.log("Original: " , array);
console.log("Filtered: " , filteredArray);
0 голосов
/ 04 января 2019

Вы можете использовать .filter, например:

let newarray1 = array.filter(obj => obj.model === 'model1');
let newarray2 = array.filter(obj => obj.model === 'model2');
...
...