【发布时间】:2016-09-25 18:53:59
【问题描述】:
我是 javascript 的新手,并且已经研究了很长时间,但无法弄清楚这种语法。当我尝试将一个数组推入另一个数组时,它会单独推入元素,而不是像我想要的那样创建一个数组数组。
我正在尝试做的事情:
lastTimes 作为数组数组:
lastTimes = [[1, 12435235], [2,443531923], [3,4925951]]
如果:IDandTime = [5, 5959393]
将IDandTime 附加到lastTimes 作为数组:
lastTimes = [[1, 12435235], [2,443531923], [3,4925951], [5, 5959393]]
或者如果 ID (IDandTime[0]) 已经存在,则更新该数组在 lastTimes 内的时间:
如果IDandTime = [1, 50305240]
将 ID 1 的时间更新为 50305240:
lastTimes = [[1, 50305240], [2,443531923], [3,4925951], [5, 5959393]]
有人介意帮助我吗?我尝试了许多语法组合,但都无法正确使用,也未能成功找出正确的搜索词来找到预先存在的答案。非常感谢任何建议。
编辑:
代码:
var lastTimes = [];
var IDandTime = [1, 5935935];
lastTimes.push(IDandTime);
结果:
lastTimes = [1, 5935935]
我想要的结果:
lastTimes = [[1, 5935935]]
EDIT2:
好的,这是我正在使用的全部功能。我有一个带有 XBee 串行模块的 node.js 服务器,以及几个带有 XBee 串行模块的 Arduino 温度传感器。我有一个握手机制,但我试图在节点退出时实现错误检查,因此不再使用它们的陈旧数据。我觉得这实际上只是基本二维数组语法的问题。
// Open a new serial port connection
sp.on("open", function (err) {
if (err) {
return console.log('Error opening port: ', err.message);
}
console.log('open');
var nodeCount = 0;
var nodes = []; // get rid of after debugging
var lastTimes = [];
lastTimes[0] = [0,0]; // initalize as 2D array for later
// Grab data from buffer
sp.on('data', function(data) {
// Initialize time Object
var time = new Date();
// Split incoming data by newline
var buffer0 = data.split('\n');
// New node handshake initiation received
if (buffer0 == "BROADCASTING") {
nodeCount++;
var sendID = nodeCount.toString();
sp.write(sendID);
console.log("Broadcast received. Sending identifier #" + sendID);
nodes.push(nodeCount);
}
// Preconnected node data received
if ((buffer0 != "BROADCASTING") && (nodeCount > 0)) {
var receiveTime = time.getTime();
// [ID, Temp] touple
var nodeData = buffer0[0].split(" ");
console.log("NodeID: " + nodeData[0] + " Temp(F): " + nodeData[1]);
// [ID, Time] touple
var IDandTime = [];
IDandTime.push(nodeData[0]);
IDandTime.push(time.getTime());
console.log("IDandTime: " + IDandTime);
// Check for preexisting node ID
var oldNode = 0;
var nodeIndex = 0;
for (var i = 0; i < lastTimes.length; i++) {
if (lastTimes[i][0] == IDandTime[0]) {
oldNode = 1;
nodeIndex = i;
}
}
// If new node, add new node data to lastTimes (list of [ID, Time] touples)
if (oldNode == 0) {
lastTimes[lastTimes.length] = IDandTime;
console.log("lastTimes: " + lastTimes);
}
// If preexisting node, update preexisting node time
else if (oldNode == 1) {
lastTimes[i][1] = IDandTime[1];
}
}
});
});
我上次尝试找到正确语法的错误:
lastTimes[i][1] = IDandTime[1];
^
TypeError: Cannot set property '1' of undefined
【问题讨论】:
-
如果您向我们提供用于将数组放入数组中的代码,那么我们或许可以告诉您为什么它没有按照您的意愿行事。
-
这里可以使用 ES6 MAP。即使只是作为如何做的参考。
-
我没有发布代码,因为它混合了太多不相关的部分(使用 node.js 作为无线模块的服务器),我认为它会混淆实际问题,我认为我在帖子里说清楚了。在大多数情况下,我尝试了
IDandTime = [1, 59395]然后lastTimes.push(IDandTime)的许多组合,而不是导致lastTimes = [[1,59395]],导致lastTimes = [1, 59395] -
it has so much irrelevant parts mixed in我们不需要不相关的部分,只需要相关的部分 - 你如何尝试将一个数组推入另一个数组。 -
使用 ES5 或 ES6 更干净,@NenadVracar 发布的答案就是一个很好的例子。但是,如果您阅读了有关
Map的信息,那么您会发现您同样可以使用 Javascript 对象文字,就像 @ZoltanTamasi 建议的那样。由于您使用的是最新版本的 Node,如果我是您,我会开始使用 ES6。还请查看 codereview.stackexchange.com 以获取有效的代码,但您正在寻求改进。
标签: javascript list multidimensional-array push