如何循环遍历地图列表以从下面过滤出使用JS的记录地图的List中的SearchMap键值?
file = open(filename', 'w')
for x in xrange(len(first_column)):
file.write(text)
file.close
var searchMap = new Map()
searchMap.set("ed_mood", "strong")
searchMap.set("ed_target_audience", "Expert")
searchMap.set("ed_clip_type", "intro")
注意:要过滤掉我使用AlaSql的记录,但它没有给出预期的结果。任何其他JS方式来过滤地图到地图列表?
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 = [];
searchMap.forEach(function(value, key){
var data = alasql(`select * from ? where ${key} like ?`,[master_data, `%${value}%`]);
$.each(data, (i) => filter_result.push(data[i]));
});
答案 0 :(得分:2)
以下代码filters
master_data
仅return
Objects
与param
中的每个searchMap
匹配。
有关详细信息,请参阅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)

答案 1 :(得分:1)
代码中的问题是您使用(隐式)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>
&#13;
使用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);
&#13;
<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>
&#13;
答案 2 :(得分:0)
您可以在此处使用lodash的filter
方法。
在你的情况下,你会这样做:
const result = _filter(master_data, {
ed_mood: 'strong',
ed_target_audience: 'expert',
ed_clip_type: 'intro'
});
上详细了解相关信息