在JavaScript

时间:2018-05-01 09:37:57

标签: javascript arrays

我想设置一个包含 m * n 对象的网格。此网格的宽度为 m 行, n 列。

我先试过这段代码

let map = [][]; // Create an array that takes a x and y index

function createMap() {
    for (let x = 0; x < columnCount; x++) {
        for (let y = 0; y < rowCount; y++) {
            addCell(x, y); 
        }
    }
}

function addCell(x, y) {
    map[x][y] = cell(); // create a new object on x and y
}

显然这是一种错误的语法。地图的初始化是错误的。如何通过将x和y坐标传递给数组来创建可以访问对象的数组?

我想说我想访问(3 | 7)上的对象我想去map[3][7]

这可能吗?

7 个答案:

答案 0 :(得分:3)

你无法初始化2d数组,因为js中没有真正的2d数组。但是,您可以设置常规数组,并向其中添加数组:

 function createMap(columnCount, rowCount) {
   const map = [];
   for (let x = 0; x < columnCount; x++) {
     map[x] = []; // set up inner array
     for (let y = 0; y < rowCount; y++) {
        addCell(map, x, y);
     }
   }
   return map;
 }

 function addCell(map, x, y) {
    map[x][y] = cell(); // create a new object on x and y
 }

 const map = createMap(10, 10);

答案 1 :(得分:2)

您需要一个数组作为值,并检查一行是否不存在。

function createMap(rowCount, columnCount) {
    for (let x = 0; x < rowCount; x++) {
        for (let y = 0; y < columnCount; y++) {
            addCell(x, y); 
        }
    }
}

function addCell(x, y) {
    map[x] = map[x] || [];
    map[x][y] = x + '|' + y;
}

var map = [];
createMap(4, 8);

console.log(map[3][7]);
console.log(map);

使用Array.from的方法。

function createMap(rowCount, columnCount) {
    map = Array.from(
        { length: rowCount },           // take rowCount as length
        (_, i) => Array.from(           // fill with new array
            { length: columnCount },    // take columnCount for every row
            (_, j) => [i, j].join('|')  // initialize cell with some value
        )
    );
}

var map;
createMap(4, 8);

console.log(map[3][7]);
console.log(map);

答案 2 :(得分:2)

你的解决方案实际上并不是那么遥远。不过,你是对的,你不能初始化像let a = [][]这样的二维数组。如果只为for循环添加一行,那么您的解决方案也会生成类似于地图的结构:

createMap()函数中,您只需要使用数组初始化数组的每个字段,之后您可以填充此数组的字段:

function createMap() {
    for (let x = 0; x < 10; x++) {
        map[x] = []; // initialize map[x] as an array
        for (let y = 0; y < 10; y++) {
            addCell(x, y); 
        }
    }
}

并将map初始化为一个简单数组。

这是一个有效的例子:

let map = [];

createMap();

console.log(map);

function createMap() {
    for (let x = 0; x < 5; x++) {
    				map[x] = [];
        for (let y = 0; y < 5; y++) {
            addCell(x, y); 
        }
    }
}

function addCell(x, y) {
    map[x][y] = cell(x,y); // create a new object on x and y
}

function cell(x,y) {
	return (x+1)+":"+(y+1);
}

答案 3 :(得分:2)

不确定您是否在创建网格或显示网格时遇到问题。

这是创建它的另一种方法:

xml = '''
<x id = '123'>
    <b><c>abcd</c></b>
</x>
<x id ='456'>
    <z></z>
</x>
<x id ='567'>
    <c>def</c>
</x>'''
soup = BeautifulSoup(xml, 'html.parser')
for x in soup.find_all('x'):
    if x.find('c'):
        x.decompose()
print(soup)

以下是显示网格的两种方法:

<x id="456">
<z></z>
</x>

答案 4 :(得分:0)

这是一种不依赖任何重新分配或变异的功能方法:

&#13;
&#13;
const lengthX = 5;
const lengthY = 2;
const map = Array.from({ length: lengthX }, (_, colIndex) => (
  Array.from({ length: lengthY }, (_, rowIndex) => (
    // some element to put in each, for example
    { foo: 'bar'}
  ))
));
console.log(map);
    
&#13;
&#13;
&#13;

colIndexrowIndex是可选的,它们不会在此代码段中使用,但如果您需要根据其在网格中的位置创建元素,那么它们就是要使用的变量。

答案 5 :(得分:0)

试试这个:

$message.MailboxName
$message.MessageID

答案 6 :(得分:0)

var grid=[];
var grid_length=10; //mathematical length
var grid_width=10;  //mathematical width

function pos(x,y){
  return (y*grid_length)-grid_length-1+x-2;
}

function replaceItem(x,y,item){
  grid[pos(x,y)]=item;
}

var itemsRequested=[];
function iRequest(x,y){ // get Item on grid.
  itemsRequested.push(grid[pos(x,y)]);  // this both adds the Object to a list and returns it
  return grid[pos(x,y)];
}

此方法仅生成数学网格,您可以使用pos()函数进行引用。

然后回答你的问题以获得3,7上的对象,你只需说

var a=iRequest(3,7);
//currently would return undefined because there are no objects in the array.

使用此方法时,1,1是左上角,pos(1,1)将返回0.