javascript - 将 javascript "almost arrays"转换为 "arrays"最干净的方法是什么?

标签 javascript arrays

过去几个月我一直在研究 JavaScript,在多年未使用它之后发现它确实令人耳目一新。

也就是说,真正让我困扰的一件事是它描述“[]”结构的不一致。

特别是,我习惯让数组有“map”功能,但很多用“[]”括起来的东西不支持map,但往往支持同义词,有时根本不支持。

示例:

  1. document.getElementById('my-div').children

根本没有可映射性,每次我需要映射它时,我都必须求助于 for 循环。

  • document.querySelectorAll('#my-div *')
  • forEach::回调 -> 未定义

    与映射不同,它不返回数组,因此链接转换很“奇怪”,因为除了映射对象之外,您还必须将结果存储在数组中才能继续。

    这意味着以下内容将不起作用。

    (() => {
        document.querySelectorAll('#my-div *').forEach((divObject) => {
            console.log('found a ' + divObject.tagName + '.');
            return divObject;
        }).forEach((divObject) => {
            console.log('more transformations on ' + divObject.tagName + '.');
            return divObject;
        });
    })();
    

    但这会:

    (() => {
        var children = [];
    
        document.querySelectorAll('#my-div *').forEach((divObject) => {
            children.push(divObject);
        });
    
        children.map((divObject) => {
            console.log('found a ' + divObject.tagName + '.');
            return divObject;
        }).map((divObject) => {
            console.log('more transformations on ' + divObject.tagName + '.');
            return divObject;
        });
    })();
    

    但是,在 forEach 中“一个接一个”地复制元素只是额外的工作,没有任何实际目的,通常应该在发布这样的代码之前进行优化,因为它会无缘无故地损害性能。

  • jQuery 的 map 工作正常。例如$('#my-div *')有一个map::callback ->数组支持map操作。因此它可以按预期链接。
  • 问题:

    有没有一种更干净的方法来克服类似数组的接口(interface)(看起来是“数组”但不支持 Array.prototype.map 的东西)的不一致性,而不是使用 for 循环进行第一次迭代,插入内容,只有在知道它的行为方式是您认为的行为方式之后?

    最佳答案

    对于所有奇异的数组,如节点列表等,如果它们是可迭代的,你可以安全地这样做

    varproperArray = [...arrayLike]varproperArray=Array.from(arrayish)

    或者你甚至可以这样做

    var properarray = Array(arrayish.length),
                  i = 0;
    for (var key of arrayish) while i < arrayish.length properArray[i++] = arrayish(key);
    

    如果你有一个像

    这样的对象

    var o = {prop_1:"one thing",
             prop_2:"another thing"},
        a = [];
    
    o[Symbol.iterator] = function* (){
                           var oks = Object.keys(this);
                           for (var key of oks) yield this[key]
                         }
    a = [...o];
    console.log(a);

    您可以使其可迭代并以相同的方式将其转换为数组;

    关于javascript - 将 javascript "almost arrays"转换为 "arrays"最干净的方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38935215/

    相关文章:

    javascript - 按值匹配复选框

    javascript - 对对象数组进行排序

    arrays - Powershell:删除小于限制的数组元素

    c# - 将字符串数组组合在一起

    arrays - 数组上的嵌套 for 循环

    javascript - Rails 中的 json 路由取决于从何处调用

    javascript - 如何用正则表达式获取最后一段?

    javascript - 显示不会根据所选选项而改变

    javascript - 在javascript中访问元素

    javascript - 如何在Javascript中向数组中的随机元素添加不同的数据属性?