0

我有一个包含objectiveDetail 对象的javascript 数组。

objectiveDetails[]

这里我添加了一个新的objectiveDetail:

var emptyObjectiveDetail = {
  "number": formData.objectiveDetails.length +1, // I want to change this !
  "text": "", 
  "response": false, 
  "objectiveId": formData.objectiveId
};
objectiveDetails.push(emptyObjectiveDetail);

我怎样才能使我分配给 emptyObjectDetail 字段的数字等于数组中objectiveDetail对象当前使用的最大数字。

换句话说,如果我有三个objectiveDetail对象,其中“数字”字段设置为1、4和5,那么当我添加一个新对象时,我想用数字6而不是数组的长度+ 1来添加它

我也对使用 _underscore 感兴趣,并想知道是否有一种使用下划线和 javascript 的好方法

4

5 回答 5

2

试试下面的示例。

基本思想是使用该函数创建一个仅包含数组number值的虚拟一维数组,然后用于在该虚拟一维数组中查找最大值。objectiveDetails.mapMath.max

var maxNum  = Math.max.apply(Math,objectiveDetails.map(function(o){return o.number;}));
var emptyObjectiveDetail = {
    "number": maxNum+1,
  "text": "", 
  "response": false, 
  "objectiveId": 123
};
objectiveDetails.push(emptyObjectiveDetail);
于 2013-08-10T09:14:06.887 回答
1

如果我正确理解了这个问题并且formData.objectiveDetails只包含数值,我认为您可以使用它Math.max来确定最大值:

var emptyObjectiveDetail = {
  "number": Math.max.apply(null,formData.objectiveDetails) + 1,
  // etc.
};
于 2013-08-10T09:03:05.640 回答
0

你可以试试

var emptyObjectiveDetail = {
  "number": objectiveDetails[objectiveDetails.length-1].number + 1, // I want to change this !
  "text": "", 
  "response": false, 
  "objectiveId": formData.objectiveId
};
objectiveDetails.push(emptyObjectiveDetail);

它将使键“数字”的值等于最后输入的数字。

但是,要真正找到最大的,您必须遍历所有值并找到最大的“数字”。

于 2013-08-10T08:22:54.813 回答
0

这是我的建议:

// create an empty array
var objectiveDetails = [];
// set the current highestNumber to 0
objectiveDetails.highestNumber = 0;
// add a custom method to add an objectiveDetail
objectiveDetails.add = function(objectiveDetail) {
    // if objectiveDetail is not given make an empty object
    objectiveDetail = objectiveDetail ? objectiveDetail : {};
    // if objectiveDetail.number is not given give it highestNumber+1
    if (!objectiveDetail.number) {
        objectiveDetail.number = objectiveDetails.highestNumber + 1;
    }
    // check if highestNumber is still the highest
    if (objectiveDetail.number > objectiveDetails.highestNumber) {
        objectiveDetails.highestNumber = objectiveDetail.number;
    }
    // add objectiveDetail to array
    objectiveDetails.push(objectiveDetail);
}

例子:

var emptyObjectiveDetail = {
  "number": 3,
  "text": "", 
  "response": false, 
  "objectiveId": 412
};
objectiveDetails.add(emptyObjectiveDetail);

var emptyObjectiveDetail = {
  "number": 2,
  "text": "", 
  "response": false, 
  "objectiveId": 413
};
objectiveDetails.add(emptyObjectiveDetail);

var emptyObjectiveDetail = {
  "text": "", 
  "response": false, 
  "objectiveId": 414
};
objectiveDetails.add(emptyObjectiveDetail);

var emptyObjectiveDetail = {
  "number": objectiveDetails.highestNumber+1,
  "text": "", 
  "response": false, 
  "objectiveId": 414
};
objectiveDetails.add(emptyObjectiveDetail);

console.log(objectiveDetails);
于 2013-08-10T08:33:28.533 回答
0

我相信除了已经建议的方法之外,还有其他两种方法:

1)(最有效):将值存储在一个数字中(可能作为全局变量或作为类的变量)。在添加对象时不断更新它。添加新对象时,请检查此编号并相应地添加对象。

优点:计算效率最高。添加新对象时无需遍历所有对象。

2)(优化我相信):好的,这里使用下划线,我相信它是优化的:D

var maxNum = _.max(objectiveDetails,function(objectiveDetail){return objectiveDetail.number;});
var emptyObjectiveDetail = {
    "数字": maxNum+1,
  “文本”: ””,
  “响应”:错误,
  “目标标识”:123
};
objectDetails.push(emptyObjectiveDetail);

优点:使用针对此类内容进行了优化的库。

希望有帮助:)

于 2013-08-10T09:57:40.383 回答