更好的方法来改善我的代码没有很多for循环

时间:2017-03-29 01:51:19

标签: javascript arrays

我正在尝试优化我的代码。我有一个JSON对象数组,我需要循环遍历这些对象并查看它们是否包含多个单词并跟踪JSON对象(如果包含所有世界,而不仅仅是一个,而是所有这些对象)。我不想传递给一个世界数组的函数,因为我觉得我必须为循环添加另一个。现在,我的代码遍历每个输入字段,如果它不是空的,则调用函数并传递世界输入字段。如果我只检查一个单词,我的代码工作正常,但我需要检查多个并跟踪包含所有世界的对象

我的代码:  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

1 个答案:

答案 0 :(得分:2)

我不认为你的数组是一个有效的JavaScript数组,但如果你的数组的形式是

var array = [
    { "x":"Bye","y":"Bye","z":"Hello"},
    { "x":"Bye","y":"Bye","z":"Hi"},
    { "x":"Bye","y":"Hello","z":"Hi"},
];

然后你可以在ES6 +中试试这个:

&#13;
&#13;
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()));
&#13;
&#13;
&#13;

.slice()只是一个浅层副本,因为我不想修改源数组,如果需要,可以省略它。

两个功能都做同样的工作,选择你喜欢的一个:)

<强>编辑:

要确保indexOf正在搜索值而不是键,可以更改为搜索

'"' + key + '",''"' + key + '"}'