我正在尝试优化我的代码。我有一个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 + '"}'

10-04 23:32