我試圖根據陣列中每個物件的某些屬性值中是否存在所有給定的搜索詞來過濾物件。但我也不想在deviceId物業內搜索。
但是有沒有辦法用更少的代碼來做到這一點?
所以我做了以下事情:
- 將物件轉換為可迭代陣列
- 過濾出陣列以洗掉陣列
deviceId - 將陣列轉換回鍵/值對物件
let DeviceDtoArrayOfArray = [];
DeviceDtos.forEach((indiv) => {
DeviceDtoArrayOfArray.push(Object.entries(indiv));
});
let DeviceDtoArrayOfArrayFiltered = [];
DeviceDtoArrayOfArray.forEach((indiv) =>
DeviceDtoArrayOfArrayFiltered.push(
indiv.filter((indiv) => indiv[0] !== "deviceId")
)
);
let DeviceDtoArrayOfArrayFilteredObjects = [];
DeviceDtoArrayOfArrayFiltered.forEach((indiv) => {
DeviceDtoArrayOfArrayFilteredObjects.push(Object.fromEntries(indiv));
});
- 定義樣本搜索詞陣列
- 對于第 3 步中的每個物件,創建其屬性值的陣列
- 通過搜索每個Search Term過濾陣列中的每個Object,檢查它是否存在于步驟5中的某些屬性值中,如果存在,則將物件回傳到新陣列,如果不存在,則將其過濾掉
包含物件的示例陣列 deviceId
const DeviceDtos = [
{
deviceId: 1,
deviceName: "Device0000",
hwModelName: "Unassigned",
deviceTypeName: "Unassigned",
serviceTag: "A1A"
},...
示例搜索詞
const searchTerms = ["HwModel", "A1A"];
根據搜索詞過濾掉物件
const results = DeviceDtoArrayOfArrayFilteredObjects.filter((indiv) => {
const propertiesValues = Object.values(indiv); // all property values
return searchTerms.every((term) =>
propertiesValues.some(
(property) => property.toLowerCase().indexOf(term.toLowerCase()) > -1
)
);
});
console.log(results);
uj5u.com熱心網友回復:
將設備陣列映射到一個新陣列,其中一項是設備,一項是由鍵和值組成的字串陣列(deviceId用 rest 語法排除)。
然后,您所要做的就是根據這些字串.every中是否包含其中一個搜索詞來過濾該陣列。.some
const DeviceDtos = [
{
deviceId: 1,
deviceName: "Device0000",
hwModelName: "Unassigned",
deviceTypeName: "Unassigned",
serviceTag: "A1A"
},
{
notincluded: 'notincluded'
}
];
const devicesAndStrings = DeviceDtos.map(
({ deviceId, ...obj }) => [obj, Object.entries(obj).flat()]
);
const searchTerms = ["hwModel", "A1A"];
const foundDevices = devicesAndStrings
.filter(([, strings]) => searchTerms.every(
term => strings.some(
string => string.includes(term)
)
))
.map(([obj]) => obj);
console.log(foundDevices);
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/413814.html
標籤:
