下划线扩展对象
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>
您可以循环更改 day
为 Monday
的属性
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'});
}
这将更改它,因为它具有相同的对象引用。
尽管您的问题对于如何处理这些事件并不太具体
我想扩展一个对象来添加另一个属性:
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>
您可以循环更改 day
为 Monday
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'});
}
这将更改它,因为它具有相同的对象引用。
尽管您的问题对于如何处理这些事件并不太具体