繁体   English   中英

JavaScript初始化/添加/更新数组

[英]JavaScript initializing/appending/updating array of arrays

我是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]]

编辑2:

好的,这是我正在使用的全部功能。 我有一个带有XBee串行模块的node.js服务器,以及几个带有XBee串行模块的Arduino温度传感器。 我有一个握手机制,但是我正在尝试实现对节点退出时的错误检查,因此不再使用其过时的数据。 我觉得这实际上只是基本2D数组语法的问题。

// 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

您可以使用findIndex来检查第一个数字是否在数组的某些元素中,然后更改原始数组中的该元素或将新元素推送到数组中。

 var lastTimes = [[1, 12435235], [2,443531923], [3,4925951]]; function update(val) { var i = lastTimes.findIndex(function(e) { return e[0] == val[0]; }); if (i != -1) { lastTimes[i][1] = val[1]; } else { lastTimes.push(val); } } update([1, 50305240]) console.log(lastTimes) 

您可以使用纯对象(没有原型)而不是数组,如下所示:

var lastTimes = Object.create(null);

而不是推送一个元组,您只需设置该对象的属性。 这样,您不必手动处理更新或追加,一切都将自动运行,如下所示:

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);

lastTimes[nodeData[0]] = time.getTime();

要遍历值:

Object.keys(lastTimes).forEach(id => {
    var value = lastTimes[id];
});

而要通过id查找值只是:

var value = lastTimes[id];

首先,如果data是字符串,则调用data.split('\\n')返回Array(请参见String.prototype.split() ),因此每个您进行比较, if (buffer0 == "BROADCASTING")被评估为false 您可能想比较数据的第一行,第一行在buffer0[0] ,因此请写条件if (buffer0[0] == ... )

然后你有代码错误

// If preexisting node, update preexisting node time
else if (oldNode == 1) {
    lastTimes[i][1] = IDandTime[1];
}

在循环中使用变量i地方,但是因为循环没有以break关键字终止,所以循环总是遍历整个数组,并且在循环结束后,变量i设置为lastTimes.length ,它指向不存在的变量数组中的索引。

我会这样写循环:

var IDandTime = [];
var nodeIndex = nodeData[0];
IDandTime.push(nodeIndex);
IDandTime.push(time.getTime());

var foundAtIndex;
for (var i = 0, l = lastTimes.length; i < l; i++) {
    if (lastTimes[i][0] === nodeIndex) {
        foundAtIndex = i;
        break;
    }
}

if (typeof foundAtIndex === 'undefined') {
     lastTimes.push(IDandTime);
} else {
    lastTimes[foundAtIndex] = IDandTime;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM