【问题标题】:Given a function that returns me "[prop1][prop2][prop3]" for a nested javascript object, how do I get the value of object[prop1][prop2][prop3]? [duplicate]给定一个为嵌套 javascript 对象返回“[prop1][prop2][prop3]”的函数,我如何获取 object[prop1][prop2][prop3] 的值? [复制]
【发布时间】:2019-04-18 02:28:47
【问题描述】:

我正在编写一个函数来使用 Javascript 将数组转换为列表。

如果输入数组如下:

let inputArray = [1,2,3]

输出对象应如下所示:

let outputList = { 
    value: 1, 
    rest: {
        value: 2,
        rest: {
            value : 3,
            rest: null } } }

我有以下函数,它接受一个嵌套对象作为其参数,并返回一个字符串,该字符串表示对象中的哪个位置,该属性为空:

function getLastValue(object) {
   let s = '';
   if (object.rest) {
     return s += '[rest]' + getLastValue(object.rest);
   } else {
     return s;
}

以及下面将数组转换为列表的函数:

var list = {value: '', rest: null};

function constructList(arr) {
    for (let prop of arr) {
        let lastValue = getLastValue(list);
        `${list}${lastValue}`.value = prop;
        `${list}${lastValue}`.rest = null;
    }
    return list;
}

constructList 函数无法工作,因为${list}${lastValue} 是一个字符串。我需要从

转换上述内容
'list[rest][rest]' 

list[rest][rest]

感谢任何帮助!

【问题讨论】:

    标签: javascript


    【解决方案1】:

    这将是使用reduceRight 的好地方 - 首先构造最里面的对象,并将其作为累加器的新值,将其分配给下一个最里面的对象的rest 属性,依此类推:

    const constructList = arr => arr.reduceRight(
      (rest, value) => ({ value, rest }),
      null
    );
    console.log(
      constructList([1, 2, 3])
    );

    要修复您的原始代码,而不是构造一个试图引用嵌套对象的 string,而是遍历嵌套结构以查找最里面的 rest 属性,并返回该对象不包含真实的rest 属性:

    function getLastValue(obj) {
      while (true) {
        if (!obj.rest) return obj;
        obj = obj.rest;
      }
    }
    
    var list = {
      value: '',
      rest: null
    };
    
    function constructList(arr) {
      for (let prop of arr) {
        const nestedObj = getLastValue(list);
        nestedObj.value = prop;
        nestedObj.rest = {};
      }
      getLastValue(list).rest = null;
      return list;
    }
    
    console.log(
      constructList([1, 2, 3])
    );

    【讨论】:

      猜你喜欢
      • 2016-07-27
      • 1970-01-01
      • 2015-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-13
      • 2022-01-01
      • 2015-08-18
      相关资源
      最近更新 更多