将列表转换为数组

时间:2017-03-09 12:35:13

标签: javascript arrays

我有一个函数,它将列表作为参数,并且必须将列表的元素返回到数组中。 例如,在输入的情况下:

{value: 1, rest: {value: 2, rest: null}}

输出应该像:

[1, 2]

这就是我试图解决的问题:

function listToArray(list){
  var arr = [];
    for (var node = list; node; node = node.rest) {
        arr.unshift(node);

    }
  return arr;

}
console.log(listToArray({value: 1, rest: {value: 2, rest: null}}));

我得到的输出是:

[{value: 2, rest: null}, {
value:  1
rest:   {value: 2, rest: null}
}]

有谁知道我应该改变什么才能让它发挥作用?

2 个答案:

答案 0 :(得分:2)

您刚从节点中错过了.value



function listToArray(list){
  var arr = [];
    for (var node = list; node; node = node.rest) {
        arr.unshift(node.value);

    }
  return arr;

}
console.log(listToArray({value: 1, rest: {value: 2, rest: null}}));




请注意,您可能需要push而不是unshift

答案 1 :(得分:0)

您可以使用递归来获取所有内部对象值。

var obj = {value: 1, rest: {value: 2, rest: null}};
var list = objToList(obj, 'value', 'rest');

console.log(list);

function objToList(obj, valueField, targetField) {
  return objToListInner(obj, valueField, targetField, []);
}

function objToListInner(obj, valueField, targetField, list) {
  if (isObject(obj)) {
    list.push(obj[valueField]);
    objToListInner(obj[targetField], valueField, targetField, list)
  }
  return list;
}

function isObject(obj) {
  return obj !== null && typeof obj === 'object';
}
.as-console-wrapper {
  top: 0;
  max-height: 100% !important;
}

一点代码打高尔夫球。 ;)

let obj  = {value: 1, rest: {value: 2, rest: null}},
    list = objToList(obj, 'value', 'rest');

console.log(list);

function objToList(o, v, t, l) {
  return o ? objToList(o[t], v, t, (l||[]).concat(o[v])) : (l||[])
}
.as-console-wrapper {
  top: 0;
  max-height: 100% !important;
}