Фильтрация массива объектов на основе критериев фильтрации в другом массиве объектов: JavaScript - PullRequest
0 голосов
/ 25 апреля 2019

Я хочу отфильтровать myArray на основе критериев, указанных в myFilter.Ключи myFilter определены и могут быть доступны с помощью myFilter.field, myFilter.value, где в качестве ключа: значение myArray неизвестно.Возможно, нам придется перебрать каждый объект в myArray, чтобы сначала сопоставить myArray [ключ] с myFilter.field, а затем с этим myArray [ключ] с myFilter.value.

Это должно быть логикой AND

myArray = [{
    make: "Honda",
    model: "CRV",
    year: "2017"
  },
  {
    make: "Toyota",
    model: "Camry",
    year: "2020"
  },
  {
    make: "Chevy",
    model: "Camaro",
    year: "2020"
  }
]

myFilter = [{
    field: "make",
    value: "Chevy",
    type: "string"
  },
  {
    field: "year",
    value: "2020",
    type: "date"
  }
];


// Expected OutPut:
myArray = [{
  make: "Chevy",
  model: "Camaro",
  year: "2020"
}]


var tempArray = [];
const keysToMatch = myFilter.length;
let matchedItems = [];
myArray.forEach((data) => {
  matchedItems = [];
  let itemsToFind = Object.values(data);
  myFilter.forEach((filterItem) => {
    if (itemsToFind.indexOf(filterItem.value) != -1) {
      matchedItems.push("matched");
    }
  });
  //check if everything matched
  if (matchedItems.length === keysToMatch) {
    tempArray.push(data);
  }
});

console.log(tempArray);

Ответы [ 4 ]

0 голосов
/ 25 апреля 2019

Это может быть немного сложнее для того, что вам нужно, но это работает.

myArray = [
    {
        make: "Honda", 
        model: "CRV",
        year: "2017"
    },
    {
        make: "Toyota", 
        model: "Camry",
        year: "2020"},
    {    
        make: "Chevy", 
        model: "Camaro",
        year: "2020"}
    ]

    myFilter = [
        {
            field: "make",
            value: "Chevy",
            type: "string"
        },
        {
            field: "year",
            value: "2020",
            type: "date"
        }
    ];
         //only return those that return true
var newArray = myArray.filter(car => {
	var temp = true;
    //iterate over your filters
	for (var i = 0; i < myFilter.length; i++) {
        //if any filters result in false, then temp will be false
		if (car[myFilter[i].field] != myFilter[i].value) {
			temp = false;
		}
	}
	if (temp == true) {
		return true;
	} else {
		return false;
	}
});
console.log(JSON.stringify(newArray));
    
0 голосов
/ 25 апреля 2019
var tempArray = [];
const keysToMatch = myFilter.length;
let matchedItems = [];
myArray.forEach((data) => {
    matchedItems = [];
    let itemsToFind = Object.values(data);
    myFilter.forEach((filterItem) => {
        if (itemsToFind.indexOf(filterItem.value) != -1) {
            matchedItems.push("matched");
        }
    });
    //check if everything matched
    if (matchedItems.length === keysToMatch) {
        tempArray.push(data);
    }
});

console.log(tempArray);
0 голосов
/ 25 апреля 2019

Теоретически это должно работать, но по какой-то причине не работает (возвращает пустой массив).Я надеюсь на то, что некоторые другие читатели могут сделать это!Не стесняйтесь редактировать.

myArray = [{
    make: "Honda",
    model: "CRV",
    year: "2017"
  },
  {
    make: "Toyota",
    model: "Camry",
    year: "2020"
  },
  {
    make: "Chevy",
    model: "Camaro",
    year: "2020"
  }
]

myFilter = [{
    field: "make",
    value: "Chevy",
    type: "string"
  },
  {
    field: "year",
    value: "2020",
    type: "date"
  }
];


const myNewArray = myArray.filter((car) => myFilter.every((filter) => car[filter.field] === car[filter.value]));

console.log(myNewArray);
0 голосов
/ 25 апреля 2019

Вы можете использовать обычный цикл и фильтр массива.Определите переменную filteredArray и используйте цикл для итерации myFilter.Во время каждой итерации создайте переменную k, значение которой будет установлено в фильтруемый массив.Таким образом, на первом шаге начальное значение k будет равно myArray, а k будет отфильтровано, а отфильтрованное значение будет установлено на filteredArray.Во время второй итерации и т. Д. Значение k будет установлено на первый отфильтрованный массив

let myArray = [{
    make: "Honda",
    model: "CRV",
    year: "2017"
  },
  {
    make: "Toyota",
    model: "Camry",
    year: "2020"
  },
  {
    make: "Chevy",
    model: "Camaro",
    year: "2020"
  }
]

let myFilter = [{
    field: "make",
    value: "Chevy",
    type: "string"
  },
  {
    field: "year",
    value: "2020",
    type: "date"
  }
];
let filteredArray;

for (let i = 0; i < myFilter.length; i++) {
  let k = filteredArray !== undefined ? filteredArray : myArray
  if (myFilter[i].field === 'make') {
    filteredArray = k.filter(item => item[myFilter[i].field] === myFilter[i].value)
  } else if (myFilter[i].field === 'year') {
    filteredArray = k.filter(item => item[myFilter[i].field] === myFilter[i].value)
  }

}
console.log(filteredArray)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...