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

时间:2016-05-07 18:57:07

标签: javascript javascript-objects break

下面的函数用于将(可能嵌套的)对象的值作为数组返回 - list参数是任何对象。如果我将break语句移动到for循环之后,我没有得到任何错误,但当然我的函数不会按需要运行。我正在使用休息方式有什么问题?

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();
}

2 个答案:

答案 0 :(得分:0)

为什么不写这样的东西:

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

答案 1 :(得分:0)

如果有其他人遇到此问题:三元运算符只能处理值表达式,而不能处理语句(如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;
}