二维数组arr[i][0]返回错误结果问题(JavaScript+ASP.NET+C#)
问题分析与解决方案
首先,咱们来揪出问题的根源:你生成SelectedObjects的方式导致了数组嵌套层级不对!
你看这段代码:
SelectedObjects.push(new Array(AllObjectsArray.filter(elem => elem[0] === element)));
AllObjectsArray.filter()返回的本身就是一个数组(哪怕匹配到的只有一个元素,它也是长度为1的数组),然后你又把这个数组塞进new Array()里,这就造成了SelectedObjects是一个三层嵌套的数组——每一项都是[[name, value, keyword]],而不是你预期的[name, value, keyword]。
这就解释了为什么:
SelectedObject[i][0]返回整个内层数组(因为它是三层里的第二层)SelectedObject[i][1]返回null(因为每一项的数组只有一个元素,就是那个filter返回的数组)- alert的时候看起来像逗号拼接的字符串,因为数组转字符串时会把所有嵌套的元素都用逗号连起来
解决方案1:修正SelectedObjects的生成(推荐)
既然你要找的是单个匹配的对象,用find()代替filter()就好——find()会直接返回第一个匹配到的元素,而不是数组。这样SelectedObjects就会变成你预期的二维数组:
var AllObjectsArray = []; @foreach(var Cobject in Model.ObjectList) { @:AllObjectsArray.push(new Array("@Cobject.Name", "@Cobject.Value", "@Cobject.Keyword")); } var SelectedObjects = []; uniqueobj.forEach(function (element) { // 用find获取单个匹配元素,而非filter返回数组 const matchedItem = AllObjectsArray.find(elem => elem[0] === element); // 加个判断避免找不到匹配项时push undefined if (matchedItem) { SelectedObjects.push(matchedItem); } });
之后生成ValuesArray就简单了,直接取每一项的第一个元素:
// 传统for循环写法 var ValuesArray = []; for (let i = 0; i < SelectedObjects.length; i++) { ValuesArray.push(SelectedObjects[i][0]); }; // 更简洁的map写法 var ValuesArray = SelectedObjects.map(item => item[0]);
解决方案2:不修改SelectedObjects,直接处理现有结构
如果你暂时不想改SelectedObjects的生成逻辑,也可以在提取值的时候跳过多余的嵌套层级:
var ValuesArray = []; for (let i = 0; i < SelectedObjects.length; i++) { // 因为SelectedObjects[i]是[ [name, value, keyword] ],所以取[0][0] ValuesArray.push(SelectedObjects[i][0][0]); };
不过这种方式只是“治标”,还是推荐第一种方案从根源上修正数组结构,避免后续出现更多嵌套相关的问题。
内容的提问来源于stack exchange,提问作者positive perspective
相关产品推荐
相关产品推荐

