下划线扩展对象

Underscore extend an object

我想扩展一个对象来添加另一个属性:

var days = [{day:'monday'},{day:'tuesday'}];
    _.extend(days,{day:'monday'},{name:'Peter'});

// DAYS NOT EXTENDED
console.log(days);
// I WANT TO HAVE AS RESULT
// [{day:'monday',name:'Peter'},{day:'tuesday'}]

目标是能够根据条件更新或插入,我想找到 'monday' 并扩展,'tuesday' 并扩展等等...... 如果我再次找到 'monday' 我想删除 name 属性并用新的条件替换它

============

更新

这是来自 T.J Crowder 的解决方案,如果我在同一天使用新条件进行搜索,它会更新对象:

var days = [{day:'monday'},{day:'tuesday'}];
var day = _.find(days, function(day) {
  return day.day == 'monday';
});

if (day) {
  _.extend(day,{day:'monday'},{name:'Peter'});
}

console.log(days);

这个输出(我在这里搜索 'Monday' 并插入 Peter,我对 Ronald 做同样的事情,我再次搜索 'Monday' 并用 Sandy 更新名字): 代码更新但还在对象

的最后插入新的一天 'Monday'
///// THE initial object
({
    'day':'Monday'
},{
    'day':'Tuesday'
})
///// search 'Monday' and add {name : 'Peter'}
({
    'name':'Peter',
    'day':'Monday'
},{
    'day':'Tuesday'
},{
    'day':'Monday'
})


//// search 'Monday' again and update with {name : 'Sandy'}
({
    'name':'Sandy',
    'day':'Monday'
},{
    'day':'Tuesday'
},{
    'day':'Monday'
},{
    'day':'Monday'
})

所以我的问题是为什么每次更新都会延长 {day:'Monday'}?

谢谢

确实 将这些属性添加到数组中,只是没有显示它们,也没有将它们添加到您希望的位置,因为您没有以这种方式使用 _.extend。您正在扩展 array;你想扩展数组的第一个条目。这是您想要的,请注意 [0]:

var days = [{day:'monday'},{day:'tuesday'}];
_.extend(days[0],{day:'monday'},{name:'Peter'});
// Note -----^^^

console.log(days);
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>

当然,前提是您知道 day: 'monday' 的索引是 0。如果不这样做,则需要先找到日期,也许使用 _.find:

var days = [{day:'monday'},{day:'tuesday'}];
var day = _.find(days, function(day) {
  return day.day == 'monday';
});
if (day) {
  _.extend(day,{day:'monday'},{name:'Peter'});
}

console.log(days);
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>


在您对问题的编辑中,您说过上面的代码不断将 {day: 'monday'} 添加到数组中。它没有。让我们把它放在一个函数中,然后重复调用该函数:

function extendDay(dayName, properties) {
  var day = _.find(days, function(day) {
    return day.day == dayName;
  });
  if (day) {
    _.extend(day, properties);
  }
}
var days = [{day:'monday'},{day:'tuesday'}];
extendDay('monday', {name: 'James'});
extendDay('tuesday', {name: 'Sandy'});
console.log("after first two updates:");
console.log(days);
extendDay('monday', {name: 'Peter'});
extendDay('tuesday', {name: 'Joseph'});
console.log("after second two updates:");
console.log(days);
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>


但至于为什么您的代码没有看到任何内容:当您 console.log 一个数组时,许多控制台会假设您已经以 "normal" 方式使用了该数组,并且未向其添加非数组条目属性。您的代码将非数组条目属性添加到数组。

var days = [{day:'monday'},{day:'tuesday'}];
_.extend(days,{day:'monday'},{name:'Peter'});

console.log(days);
console.log(days.day);
console.log(days.name);
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>

您可以循环更改 dayMonday

的属性

var days = [{day:'monday'},{day:'tuesday'}];
    var dayName = "monday"
    var propExtend = _.extend({day:dayName},{name:'Peter'});

    for(var i = 0; i< days.length; i++){
    if(days[i].day == dayName){
    days[i] = propExtend;
    }
    }
    console.log(days)
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>

var days = [{day:'monday'},{day:'tuesday'}];
var obj =_.where(days, {day: "Monday"});
_.extend(obj[0], {name:'Peter'});
for(int i=1; i<obj.length;i++){
   _.extend(obj[i], {newCriteria:'your value'});
}

这将更改它,因为它具有相同的对象引用。

尽管您的问题对于如何处理这些事件并不太具体