将HTML元素转换为数组并处理null

时间:2019-02-10 14:58:35

标签: javascript arrays

我正在使用JavaScript读取包含数组的HTML元素,但我想它只是数组的字符串版本。因此,我将其转换为javscript整数数组,但是当HTML数组为空时,我遇到了问题。

HTML :(空数组)

<div id="activelist"> [] </div>

HTML :(数组包含值)

<div id="activelist"> [4, 5] </div>

我在脚本中使用let activeMachines = document.getElementById("activelist").innerHTML;来获取页面中的值。

如果我console.log(activeMachines);会在数组为空时返回[]

如果我console.log(activeMachines);,则当数组包含值时它将返回[3, 5]

现在将其处理为我使用的javascript整数数组:

//trim off the quotes and brackets
activeMachines = activeMachines.slice(2, -2);

//split into different objects
activeMachines = activeMachines.split(', ');

console.log(activeMachines.length);

现在我不知道的部分:

当数组为空时,console.log(activeMachines.length);将返回1

当数组中包含值时,console.log(activeMachines);将返回1

当数组中有两个值console.log(activeMachines);时将返回2

是否有一种方法可以使array.length0为空?也许.length是错误的运算符?

感谢您的帮助!

4 个答案:

答案 0 :(得分:2)

您可以使用JSON.parse并返回一个数组。

function getValue(id) {
    return JSON.parse(document.getElementById(id).innerHTML);
}

var data = ['activelist0', 'activelist1'].map(getValue);

console.log(data[0].length);
console.log(data[0]);
console.log(data[1].length);
console.log(data[1]);
<div id="activelist0"> [] </div>
<div id="activelist1"> [4, 5] </div>

答案 1 :(得分:1)

使用JSON.parse,我们可以解析innerHTML并获取要评估的实际类型。请确保将其包装在try catch中,否则将因为在div中没有​​用于内容的验证程序而遇到错误。

这是一个简单的例子:

var activeList = document.querySelectorAll('.active-list');
var debug = document.getElementById('debug');

activeList.forEach(function(elem, index) {
  try {
    var arr = JSON.parse(elem.textContent);
    debug.innerHTML += (index + 1) + ' result length is: ' + arr.length + '<br/>';
  } catch (error) {
    debug.innerHTML += (index + 1) + ' error';
  }
});
<div class="active-list">[4, 5]</div>
<div class="active-list">[1]</div>
<div class="active-list">[]</div>
<div class="active-list">this should invoke an error!</div>
<br/>
<div id="debug"></div>

答案 2 :(得分:1)

另一种选择:

// declaring a named function, using Arrow syntax:
const parseArray = (el) => {

  // retrieving the text content of the current element ('el'),
  // removing any leading and trailing spaces using
  // String.prototype.trim() and then replacing the '['
  // and ']' characters using String.prototype.replace,
  // along with a regular expression; replacing those
  // characters with an empty string:
  let values = el.textContent.trim().replace(/\[|]/g, ''),

    // if the length of the modified String is zero then we
    // return an empty Array; otherwise w split the the
    // String using String.prototype.split(), to split
    // the String into an Array:
    result = values.length === 0 ? [] : values.split(',');

  // logging the result:
  console.log(result);

  // returning the result to the calling context:
  return result;
}

// using document.querySelectorAll() to retrieve all <li>
// elements on the page, and then calling NodeList.prototype.forEach()
// in order to call the named function (note the deliberate lack of
// parentheses on the function name):
document.querySelectorAll('li').forEach(parseArray);

const parseArray = (el) => {
  let values = el.textContent.trim().replace(/\[|]/g, ''),
    result = values.length === 0 ? [] : values.split(',');
  console.log(result);
  return result;
}

document.querySelectorAll('li').forEach(parseArray);
<ul>
  <li>[]</li>
  <li>["1","2","3"]</li>
  <li>[a,b,,d,e]</li>
</ul>

JS Fiddle demo

参考文献:

答案 3 :(得分:0)

将数据模型与表示混合是一种不好的做法。更好的方法是将两者分开。例如:

var myData = [1,2,3];

function renderData(data)
{
  return data.join(", ");
}

因此,您可以操纵myData并始终获得正确的结果,而与如何呈现数据无关。