数组只包含1个值,因此推送失败

时间:2018-04-21 20:03:40

标签: javascript

var user = {};
var usernameList = document.querySelectorAll('.msg.g_bot.bot.private.i ~ .msg .usr');
for (i of usernameList) {
    if (i.childNodes[0].nodeName === 'SPAN') {
        var theUser = (user[i.childNodes[0].innerHTML] !== undefined) ? user[i.childNodes[0].innerHTML] : user[i.childNodes[0].innerHTML] = {};
        var msg = theUser.msg = [];
        msg.push(i.nextElementSibling.nextElementSibling.innerHTML);
    }    
}

对象user.whatever.msg是一个数组,但只包含1个值。所以它始终是最后一个。在这种情况下,push不起作用,因此我无法将所有值都放入该数组中。

我的代码出了什么问题?

3 个答案:

答案 0 :(得分:1)

theUser.msg = [];会在每次迭代时创建一个新数组。就像您只创建一个新的theUser对象时,您应该只创建一个msg数组。

var users = {};
var usernameList = document.querySelectorAll('.msg.g_bot.bot.private.i ~ .msg .usr');
for (var i of usernameList) {
    if (i.firstChild.nodeName === 'SPAN') {
        var name = i.firstChild.innerHTML; // should be .textContent probably
        var theUser = name in user
          ? user[name]
          : user[name] = { msg: [] };
//                        ^^^^^^^^^
        theUser.msg.push(i.nextElementSibling.nextElementSibling.innerHTML);
    }
}

答案 1 :(得分:1)

更明确的方法是使用@RunWith(PowerMockRunner.class) @PrepareForTest(Utils.class) public class ClientCodeTest { @Test public void testDoSomething() { PowerMockito.mockStatic(Utils.class); BDDMockito.given(Utils.method1()).willReturn("<mock string value>"); } }

.reduce

答案 2 :(得分:0)

您可以修改代码以验证数组是否已创建:

var user = {};
var usernameList = document.querySelectorAll('.msg.g_bot.bot.private.i ~ .msg .usr');
for (i of usernameList) {
    if (i.childNodes[0].nodeName === 'SPAN') {
        var theUser = (user[i.childNodes[0].innerHTML] !== undefined) ? user[i.childNodes[0].innerHTML] : user[i.childNodes[0].innerHTML] = {};
        if(theUser.hasOwnProperty(‘msg’) === false) {
            theUser.msg = [];
        }
        theUser.msg.push(i.nextElementSibling.nextElementSibling.innerHTML);
    }    
}