三元条件中的意外令牌中断

unexpected token break in ternary conditional

下面的函数旨在 return 来自(可能嵌套的)对象的值作为数组 - 列表参数是任何对象。如果我将 break 语句移到 for 循环之后,我不会收到任何错误,但当然我的函数不会按需要运行。我使用 break 的方式有什么问题?

function listToArray(list) {
    var objectArray = [];
    function objectPeeler() {
        let peel = Object.getOwnPropertyNames(list);
        for(var i = 0; i < peel.length; i++) {
            list[peel[i]] && typeof list[peel[i]] != 'object' ? 
                objectArray.push(list[peel[i]]): 
                list[peel[i]] ? 
                    (list = list[peel[i]], objectPeeler()) :
                    break;
        }
    return objectArray;
    }
    objectPeeler();
}

为什么不写这样的东西:

var obj = { 0: "a", 1: "b", 2: "c"}; //test target
var objectArray = [];
var keyArray = Object.getOwnPropertyNames(obj);
for (var i = 0; i < keyArray.length; i++)  objectArray.push(obj[keyArray[i]]);
console.log(objectArray);  // test result

以防其他人遇到此问题:三元运算符仅适用于值表达式,不适用于语句(如 break),并且不适用于这些情况。

这个有效:

function listToArray(list) {
    var objectArray = [];
    function objectPeeler() {
        let peel = Object.getOwnPropertyNames(list);
        for(var i = 0; i < peel.length; i++) {
            list[peel[i]] != null && typeof list[peel[i]] != 'object' ? 
                objectArray.push(list[peel[i]]): 
                list[peel[i]] ? 
                    (list = list[peel[i]], objectPeeler()): null;
        }
    }
    objectPeeler();
    return objectArray;
}

但是使用 jquery.next 方法可以得到更好的解决方案:

function listToArray(list) {
  var array = [];
  for (var obj = list; obj; obj = obj.next)
    array.push(obj.value);
  return array;
}