我正在尝试优化我的代码。我有一个JSON对象数组,我需要遍历这些对象,看看它们是否包含多个单词,并且如果包含所有世界(不仅是一个世界,而是所有世界),则要跟踪JSON对象。我不想将一个世界数组传递给该函数,因为我感觉必须添加另一个for循环。现在,我的代码遍历每个输入字段,如果不为空,则调用该函数并在其中传递世界输入字段。如果仅检查一个单词,我的代码就可以正常工作,但是我需要检查多个单词并跟踪包含所有世界的对象
我的代码:
workOrdersArray这是一个全局数组。
function searchWO (workOrdersArray) {
var filteredWO = [];
for (var i=0; i < workOrdersArray.length; i++) {
for (var prop in workOrdersArray[i]) {
if (myArray[i][prop] == nameKey) {
filteredWO.push(workOrdersArray[i]);
}
}
}
}
例:
如果一个输入字段的世界为“ Hello”,而另一个输入字段为“ Bye”
var array = [
{ "x":"Bye","y":"Bye","z":"Hello"},
{ "x":"Bye","y":"Bye","z":"Hi"},
{ "x":"Bye","y":"Hello","z":"Hi"},
];
我将JSON对象存储在单独的数组中。因此,新数组将具有obj1和obj3
最佳答案
我认为您的数组不是有效的JavaScript数组,但是如果您的数组格式如下
var array = [
{ "x":"Bye","y":"Bye","z":"Hello"},
{ "x":"Bye","y":"Bye","z":"Hi"},
{ "x":"Bye","y":"Hello","z":"Hi"},
];
然后您可以在ES6 +中尝试:
var array = [
{ "x":"Bye","y":"Bye","z":"Hello"},
{ "x":"Bye","y":"Bye","z":"Hi"},
{ "x":"Bye","y":"Hello","z":"Hi"},
];
var keyName = ["Hello", "Bye"];
function searchWO (nameKey, myArray) {
for(var key of nameKey){
myArray = myArray.filter(obj => JSON.stringify(obj).indexOf('"' + key + '"') != -1);
}
return myArray;
}
// Loop Haters Gonna Hate
function searchWO2 (nameKey, myArray) {
return nameKey.reduce((ans, key) => ans.filter(obj => JSON.stringify(obj).indexOf('"' + key + '"') != -1) , myArray);
}
console.log(searchWO(keyName, array.slice()));
console.log(searchWO2(keyName, array.slice()));
.slice()
只是一个浅表副本,因为我不想修改源数组,如果需要,可以省略它。两种功能都做相同的工作,选择一个你喜欢的:)
编辑:
为了确保
indexOf
在搜索值而不是键,可以更改为search'"' + key + '",'
和'"' + key + '"}'