如何遍历映射列表以从下面的列表中过滤掉具有使用 JS 的记录映射的列表?
地图
var searchMap = new Map()
searchMap.set("ed_mood", "strong")
searchMap.set("ed_target_audience", "Expert")
searchMap.set("ed_clip_type", "intro")
列表
var master_data =
[
{ed_mood: "Light", ed_rating: 10, ed_target_audience: "Novice", ed_clip_type: "Basic"},
{ed_mood: "Light", ed_rating: 5, ed_target_audience: "Expert", ed_clip_type: "Q&A"},
{ed_mood: "Strong", ed_rating: 8, ed_target_audience: "Expert", ed_clip_type: "Intro"},
{ed_mood: "Strong", ed_rating: 7, ed_target_audience: "Expert", ed_clip_type: "Q&A"},
{ed_mood: "Strong", ed_rating: 10, ed_target_audience: "Expert", ed_clip_type: "intro"}
]
注意:要过滤掉记录,我正在使用AlaSql,但它没有给出预期的结果。还有其他JS方法可以将地图过滤到地图列表吗?
var filter_result = [];
searchMap.forEach(function(value, key){
var data = alasql(`select * from ? where ${key} like ?`,[master_data, `%${value}%`]);
$.each(data, (i) => filter_result.push(data[i]));
});
预期成果
[
{ed_mood: "Strong", ed_rating: 8, ed_target_audience: "Expert", ed_clip_type: "Intro"},
{ed_mood: "Strong", ed_rating: 10, ed_target_audience: "Expert", ed_clip_type: "intro"}
]
以下代码filters
master_data
仅return
Objects
与searchMap
中的每个param
匹配。
有关详细信息,请参阅Array.prototype.filter()
、Array.prototype.every()
、Map.entries()
、JSON.stringify()
和String.toLowercase()
。
// Search Map.
const searchMap = new Map([
['ed_mood', 'strong'],
['ed_target_audience', 'Expert'],
['ed_clip_type', 'intro']
])
// Master Data.
const master_data = [
{ed_mood: 'Light', ed_rating: 10, ed_target_audience: 'Novice', ed_clip_type: 'Basic'},
{ed_mood: 'Light', ed_rating: 5, ed_target_audience: 'Expert', ed_clip_type: 'Q&A'},
{ed_mood: 'Strong', ed_rating: 8, ed_target_audience: 'Expert', ed_clip_type: 'Intro'},
{ed_mood: 'Strong', ed_rating: 7, ed_target_audience: 'Expert', ed_clip_type: 'Q&A'},
{ed_mood: 'Strong', ed_rating: 10, ed_target_audience: 'Expert', ed_clip_type: 'intro'}
]
// Output.
const output =
// Filter master_data for Objects that include every searchpoint.
master_data.filter((datapoint) =>
// Destructuring assignment + Map.entries to reveal searchMap entries.
[...searchMap.entries()].every((searchpoint) =>
// Object.entries() to reveal datapoint entries.
// JSON.stringify + toLowerCase() for normalization.
JSON.stringify(Object.entries(datapoint)).toLowerCase().includes(JSON.stringify(searchpoint).toLowerCase())))
// Log.
console.log(output)
代码中的问题是使用(隐式(OR
运算符连接条件。预期结果建议应使用 AND
运算符。
您可以先构建SQL命令,然后使用AlaSQL执行它(只是一个建议,您向我介绍了AlaSQL :-(
var searchMap = new Map();
searchMap.set("ed_mood", "strong");
searchMap.set("ed_target_audience", "Expert");
searchMap.set("ed_clip_type", "intro");
var master_data =
[
{ed_mood: "Light", ed_rating: 10, ed_target_audience: "Novice", ed_clip_type: "Basic"},
{ed_mood: "Light", ed_rating: 5, ed_target_audience: "Expert", ed_clip_type: "Q&A"},
{ed_mood: "Strong", ed_rating: 8, ed_target_audience: "Expert", ed_clip_type: "Intro"},
{ed_mood: "Strong", ed_rating: 7, ed_target_audience: "Expert", ed_clip_type: "Q&A"},
{ed_mood: "Strong", ed_rating: 10, ed_target_audience: "Expert", ed_clip_type: "intro"}
];
var command = "SELECT * FROM ? WHERE";
var values = [];
searchMap.forEach(function(value, key){
command += ` ${key} LIKE ? AND`;
values.push('%' + value);
});
//Removing the last "AND"
command = command.substring(0, command.length -4);
var filter_result = alasql(command, [master_data, ...values]);
console.log(filter_result);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/alasql/0.4.5/alasql.min.js"></script>
没有 AlaSQL 的解决方案
使用 ES6,您的代码可以是:
var searchMap = new Map();
searchMap.set("ed_mood", "strong");
searchMap.set("ed_target_audience", "Expert");
searchMap.set("ed_clip_type", "intro");
var master_data =
[
{ed_mood: "Light", ed_rating: 10, ed_target_audience: "Novice", ed_clip_type: "Basic"},
{ed_mood: "Light", ed_rating: 5, ed_target_audience: "Expert", ed_clip_type: "Q&A"},
{ed_mood: "Strong", ed_rating: 8, ed_target_audience: "Expert", ed_clip_type: "Intro"},
{ed_mood: "Strong", ed_rating: 7, ed_target_audience: "Expert", ed_clip_type: "Q&A"},
{ed_mood: "Strong", ed_rating: 10, ed_target_audience: "Expert", ed_clip_type: "intro"}
];
var filter_result = master_data.filter(function(x) {
for (var [key, value] of searchMap) {
//Change the comparison to fit your needs
// Condition to handle null , undefined and ''(blank) values
if (x[key] !== null && typeof x[key] !== 'undefined' && x[key] !== '') {
if (x[key].toLowerCase() !== value.toLowerCase()) return false;
} else {
return false;
}
}
return true;
});
console.log(filter_result);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/alasql/0.4.5/alasql.min.js"></script>
你可以在这里使用lodash的filter
方法。
在您的情况下,您将执行以下操作:
const result = _filter(master_data, {
ed_mood: 'strong',
ed_target_audience: 'expert',
ed_clip_type: 'intro'
});
在lodash/filter上阅读更多关于它的信息