2016-11-10 4 views
-1

Я хочу расширить объект добавить еще один атрибут:Подчеркивание расширить объект

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'}] 

Цель состоит в том, чтобы иметь возможность обновлять или вставки в зависимости от критериев, я хочу найти «понедельник» и расширить " вторником»и расширить и так далее ... если я найти„“понедельник снова я хочу, чтобы удалить имя атрибута и заменить его новым критериям

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

ОБНОВЛЕНИЕ

Это решение от 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); 

Этот выход (Здесь я поиск «понедельник» и вставить Питер, я сделать то же самое для Рональда и я поиск «понедельник» снова и обновить имя с Sandy): обновление кода, но вставить также новый день «понедельник» на последнем из объекта

///// 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' 
}) 

Так что мой вопрос, почему он проходит {день: «Понедельник»} для каждого обновления?

Спасибо

+0

здесь у вас есть массив объектов, так что если вам нужно изменить конкретный объект, Вам нужно найти его с помощью findWhere и заменить его –

+0

Ваш ожидается формат недействителен. Вам не хватает 'key' для' {name: 'Peter'} ' – Rajesh

+0

Эй, спасибо за помощь, Ryad.iv не могли бы вы привести мне пример, пожалуйста? – user44321

ответ

2

Это делает добавить эти свойства массива, они просто не показаны, и они не добавляются, где вы хотите, чтобы они были, потому что вы не используете _.extend в как это было бы. Вы расширяете массив ; вы хотите расширить первую запись массива. Вот что будет делать то, что вы хотите, обратите внимание на [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 массив, многие консолей делают предположение, что вы использовали массив в «нормальном» виде и не добавляли к нему свойства, не связанные с массивом. Ваш код добавляет свойства массива, не связанные с массивом.

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>

+0

Интересно, большое спасибо, я просто задаюсь вопросом, добавлю ли я тот же день после этого, он обновит?, Я имею в виду удалить имя атрибута и добавить еще – user44321

+0

@ user44321: это полностью зависит от того, что вы имеете в виду под «добавлением в тот же день после." Если вы сделаете это с помощью '_.extend', он не будет * удалять *' имя' ('_.extend' просто * добавляет * свойства). –

+0

Еще раз спасибо, что я хочу обновить атрибут remove по критериям выше: Найдите день и добавьте атрибут и т. Д. , если я снова найду день с другими критериями, я хочу переопределить атрибут имени – user44321

1

Вы можете перебрать, чтобы изменить свойства, где 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>

+0

Спасибо Монаше, она перезапишет атрибут, если у меня есть второе имя дня? я имею ввиду, что хочу обновить или вставить – user44321

1
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'}); 
} 

это изменит его, поскольку оно имеет одинаковую ссылку на объект.

хотя ваш вопрос не слишком конкретно о том, что делать с вхождений

+0

Итак, obj - это новая копия дней? – user44321

+0

Я отредактировал ответ, проверьте его, obj - это копия с той же ссылкой объекта, которая содержит день = понедельник, поэтому любое изменение на ней будет применено к объекту в массиве –

+0

Это, вероятно, правильный ответ, предполагающий, что это то, что хочет OP чтобы сделать, но для меня, по крайней мере, это далеко не ясно. –

Смежные вопросы