javascript数组元素是否知道其封闭数组
Are javascript array elements aware of their enclosing array?
好吧,我们有这个sql比较工具,它可以比较两个数据库,并在HTML中显示差异报告。我需要解析它创建的javascript,以了解更多关于差异的细节。例如,如果它显示500个已更改的存储过程,则我无法按更改者或更改时间进行筛选。但如果我能解析JS,我就可以根据这样的标准进行过滤。然而,他们的JS结构非常复杂,主要是嵌套数组,有时甚至可以达到4级。这是一个示例,显示了4种不同的记录。
var createsql = new Array(
new Array(new Array(0, "Error, No SQL Availible")),
new Array (
new Array(0,"-- Stored Procedure", " "),
new Array(0,"", ""),
new Array(1,"--------------------------------------------------------------------------------------", " "),
new Array(1,"/*", " "),
new Array(1,"Procedure : Schema.p_procedure1", " "),
new Array(1,"Description : This process will do something", " "),
new Array(1,"Creation Date : 11/24/2009", " "),
new Array(1,"Created By : John Doe", " "),
new Array(1,"Tables Updated : None", " "),
new Array(1,"*/", " "),
new Array(0, "", "")
),
new Array (
new Array(0,"-- Stored Procedure", " "),
new Array(0,"", ""),
new Array(1,"--------------------------------------------------------------------------------------", " "),
new Array(1,"/*", " "),
new Array(1,"Procedure : Schema.p_procedure2", " "),
new Array(1,"Description : This process will do something", " "),
new Array(1,"Creation Date : 11/24/2011", " "),
new Array(1,"Created By : Jane Doe", " "),
new Array(1,"Tables Updated : None", " "),
new Array(1,"*/", " "),
new Array(0, "", "")
),
new Array (
new Array(0,"-- Stored Procedure", " "),
new Array(0,"", ""),
new Array(1,"--------------------------------------------------------------------------------------", " "),
new Array(1,"/*", " "),
new Array(1,"Procedure : Schema.p_procedure3", " "),
new Array(1,"Description : This process will do something", " "),
new Array(1,"Creation Date : 11/24/2012", " "),
new Array(1,"Created By : Mark Doe", " "),
new Array(1,"Tables Updated : None", " "),
new Array(1,"*/", " "),
new Array(0, "", "")
)
);
我可以用这个代码解析数组并得到我需要的东西
var match = "Jane Doe";
var createLength = createsql.length;
var matched;
for(var i = 0; i < createLength; i++){
if(typeof createsql[i] === "object"){
var firstArrayLength = createsql[i].length;
for(var j = 0; j < firstArrayLength; j++){
if(typeof createsql[i][j] === "object"){
var secondArrayLength = createsql[i][j].length;
for(var k = 0; k < secondArrayLength ; k++){
if(typeof createsql[i][j][k] === 'string'){
if((createsql[i][j][k].indexOf(match) != -1)){
console.log(createsql[i][j][k]);
console.log('matched');
//need to grab the parent and search its elemets for the one that starts with the word "Procedure"
}
}
}
}
}
}
}
但我遇到的问题是,如何获得当前所在数组的父数组?例如,如果我的搜索字符串是Jane Doe
,我想检索表示"Procedure : Schema.p_procedure2"
的元素,它是同级数组中的第二个元素。请不要开枪打我!
这是小提琴
附言:任何其他改进循环的建议都是受欢迎的,这只是一个例子,列表可能会更大。
我可能遗漏了一些东西,但我认为答案相对简单:因为您知道您的数组结构,所以可以使用createsql[i][4][1]
访问您想要的内容。
注意:如果你想动态搜索以"Procedure"开头的项目,你只需要多一点代码就可以了。我认为您的问题的关键答案是从createsql[i]
开始,从适当的父数组开始第二次搜索。
小提琴:http://jsfiddle.net/nate/DBM7H/2/
console.log('Procedure', createsql[i][4][1]);
更新:
下面是一个如何动态查找过程项的示例。
小提琴:http://jsfiddle.net/nate/DBM7H/4/
创建一个函数来查找以"过程"开头的项目:
var findProcedure = function (record) {
var i, length;
for (i = 0, length = record.length; i < length; i += 1) {
if (record[i][1].substring(0, 9) === 'Procedure') {
return record[i][1];
}
}
}
然后只需在代码中使用正确记录的函数:
// Find the procedure
console.log(findProcedure(createsql[i]));
如果这些数组的形式不变,我强烈建议将它们转换为本地javascript对象,以提高使用它们的简单性:
var sqlObjs = [];
for (var i = 0; i < createsql.length; i++){
var item = createsql[i];
if (item.length != undefined && item.length > 1){
sqlObjs.push({
Procedure : item[4][1].split(":")[1].trim(),
Description : item[5][1].split(":")[1].trim(),
CreationDate : new Date(item[6][1].split(":")[1].trim()),
CreatedBy : item[7][1].split(":")[1].trim(),
TablesUpdated : item[8][1].split(":")[1].trim(),
});
}
}
然后,您可以用一种更简洁的方式搜索数组:
var match = "Jane Doe";
for (var i = 0; i < sqlObjs.length; i++){
var item = sqlObjs[i];
if (item.CreatedBy == match){
console.log(item.Procedure);
break;
}
}
你的生活会变得不那么糟糕。:)
你可以在这里看到这一点:http://jsfiddle.net/5fVqZ/1/
你可以实现一个简单的搜索来找到你想要的物品的价值,比如:
function getValue(byName, arry){
var val = "";
// this search assumes that the value will always be in the second position of the array
for (var i = 0; i < arry.length; i++){
var aVal = arry[i][1];
if (aVal.indexOf(byName) == 0){ // only grab the value if byName is at the start of the string
val = aVal.split(":")[1].trim();
return val;
}
}
return val;
}
它是这样使用的:
for (var i = 0; i < createsql.length; i++){
var item = createsql[i];
if (item.length != undefined && item.length > 1){
sqlObjs.push({
Procedure : getValue("Procedure", item),
Description : getValue("Description", item),
CreationDate : new Date(getValue("Creation Date", item)),
CreatedBy : getValue("Created By", item),
TablesUpdated : getValue("Tables Updated", item),
});
}
}
http://jsfiddle.net/5fVqZ/3/
- 从组件状态的数组中删除元素
- 从数组中删除元素的最佳方法是:javascript/jquery
- 使用filter和map方法将数组中某些元素的第一个字母大写-JavaScript
- 选择具有值数组的所有元素的最有效方法
- 从角度数组中删除元素
- 使用其中一个元素作为参考点,从Javascript数组中选择元素
- 根据对多个数组唯一的元素创建一个新数组
- 指定数组中的元素对,其总和等于特定的目标数字
- 求和d3对象数组上的元素
- 在JavaScript中,用forEach乘以数组的所有元素
- 如何覆盖 javascript 对象数组中的元素
- 从异步调用返回数组,然后为数组的每个元素返回其他异步调用
- Angular JS(离子)数据数组到$scope元素
- 如何根据数组中的元素检查字符串
- 如何在 Javascript 中计算数组中的元素
- 显示单独数组中两个数组的相同元素
- JavaScript-在数组中查找元素,并从用户提示中处理null
- 使用事件更改数组的一个元素
- 访问数组的特定元素
- 使用javascript匹配字符串中数组的一个元素