JSON对象中的排序数组给出了TypeError:无法读取未定义的属性'sort'

时间:2017-12-11 10:01:30

标签: javascript jquery json sorting

我想在javascript中对对象进行排序。 我有这个json:

var unsorted = {
    "2014": [
        {
            "title": "Book",
            "value": 10
        },
        {
            "title": "Cheese",
            "value": 2
        }
    ],
    "2015": [
        {
            "title": "Movie",
            "value": 9
        }
    ],
     "2016": [
        {
            "title": "Slay",
            "value": 90
        },
        {
            "title": "Back",
            "value": 22
        }
    ],
    "selected_year": 2015
};

所以我想根据价值对这些年内的jsons进行排序。 我试着这样做了:

var sorted = unsorted.items.sort(function(a, b) {return a.value - b.value});

alert.log(unsorted);
alert.log(sorted);

但问题是我有另一个不是json "selected_year": 2015的字段而且它出现错误TypeError: Cannot read property 'sort' of undefined

我不知道该怎么办? 这是我的JSFIDDLE

更新: 我想在“年”里面对数组进行排序,所以我得到了这个:

var sorted = {
        "2014": [
            {
              "title": "Cheese",
              "value": 2

            },
            {
              "title": "Book",
              "value": 10
            }
        ],
        "2015": [
            {
                "title": "Movie",
                "value": 9
            }
        ],
         "2016": [
             {
                 "title": "Back",
                 "value": 22
             },
            {
                "title": "Slay",
                "value": 90
            }

        ],
        "selected_year": 2015
    };

例如在排序后的“2014”里面我有:

"2014": [
        {
          "title": "Cheese",
          "value": 2

        },
        {
        "title": "Book",
        "value": 10
        }
    ]

5 个答案:

答案 0 :(得分:2)

您只能对数组属性进行排序:



var unsorted = {
    "2014": [
        {
            "title": "Book",
            "value": 10
        },
        {
            "title": "Cheese",
            "value": 2
        }
    ],
    "2015": [
        {
            "title": "Movie",
            "value": 9
        }
    ],
     "2016": [
        {
            "title": "Slay",
            "value": 90
        },
        {
            "title": "Back",
            "value": 22
        }
    ],
    "selected_year": 2015
};

var sorted = Object.assign({}, unsorted);  // Copy the unsorted object

Object.keys(sorted).forEach(key => {
  if (Array.isArray(sorted[key])) {
     sorted[key].sort((a, b) => a.value - b.value);
  }
})

console.log(sorted);




答案 1 :(得分:2)

仅对那些数组值进行排序。您可以使用Array.isArray检查数组。



var unsorted = { 2014: [{ title: "Book", value: 10 }, { title: "Cheese", value: 2 }], 2015: [{ title: "Movie", value: 9 }], 2016: [{ title: "Slay", value: 90 }, { title: "Back", value: 22 }], selected_year: 2015 };

Object
  .keys(unsorted)
  .forEach(k => {
    if(Array.isArray(unsorted[k]))
      unsorted[k].sort((a,b) => a.value - b.value);
  });

console.log(unsorted);

.as-console-wrapper { max-height: 100% !important; top: 0; }




答案 2 :(得分:1)

您可以检查该属性是否为数组,并根据需要对其进行排序。



var object = { 2014: [{ title: "Book", value: 10 }, { title: "Cheese", value: 2 }], 2015: [{ title: "Movie", value: 9 }], 2016: [{ title: "Slay", value: 90 }, { title: "Back", value: 22 }], selected_year: 2015 };

Object.keys(object).forEach(function (k) {
    if (!Array.isArray(object[k])) {
        return;
    }
    object[k].sort(function (a, b) {
        return a.value - b.value;
    });
});

console.log(object);

.as-console-wrapper { max-height: 100% !important; top: 0; }




答案 3 :(得分:1)

array of object

您正在混淆objectselected_yea这个错误的原因
  

TypeError:无法读取属性' sort'未定义的

按照这样排序



var unsorted = { 2014: [{ title: "Book", value: 10 }, { title: "Cheese", value: 2 }], 2015: [{ title: "Movie", value: 9 }], 2016: [{ title: "Slay", value: 90 }, { title: "Back", value: 22 }], selected_year: 2015 };
var newArr = [];
for(let i in unsorted){
  if(i !== 'selected_year'){
    unsorted[i] = unsorted[i].sort(function(a, b) {
      return a.value - b.value;
    });
  }
}
console.log(unsorted);




此解决方案比其他解决方案更快。

检查时间:https://jsfiddle.net/q976tk4r/

其他解决方案:https://jsfiddle.net/q976tk4r/1/https://jsfiddle.net/q976tk4r/2/

答案 4 :(得分:0)

<强>问题:

实际上JSON对象中没有这样的属性unsorted.items,多年来有几个密钥可以使用Object.keys(unsorted)访问。

<强>解决方案:

因此,使用.map()循环遍历这些元素,并检查该元素是arrayArray.isArray()返回它的排序,否则只返回值:

var sorted = Object.keys(unsorted).map(function(k) {
  if (Array.isArray(unsorted[k])) {
    return {
      [k]: unsorted[k].sort(function(a, b) {
        return a.value - b.value
      })
    }
  } else {
    return {
      [k]: unsorted[k]
    };
  }
});

<强>演示:

&#13;
&#13;
var unsorted = {
  "2014": [{
      "title": "Book",
      "value": 10
    },
    {
      "title": "Cheese",
      "value": 2
    }
  ],
  "2015": [{
    "title": "Movie",
    "value": 9
  }],
  "2016": [{
      "title": "Slay",
      "value": 90
    },
    {
      "title": "Back",
      "value": 22
    }
  ],
  "selected_year": 2015
};

var sorted = Object.keys(unsorted).map(function(k) {
  if (Array.isArray(unsorted[k])) {
    return {
      [k]: unsorted[k].sort(function(a, b) {
        return a.value - b.value
      })
    }
  } else {
    return {
      [k]: unsorted[k]
    };
  }
});
console.log(sorted);
&#13;
&#13;
&#13;