2016-08-06 3 views
2

У меня есть массив объектов, который выглядит следующим образом:Update массив объектов в JavaScript/JQuery, где поле Конкретное значение

var finishes = [ 
    {label:'Raw Steel'}, 
    {label:'Antique Pewter'}, 
    {label:'Barn Red'}, 
    {label:'Brushed Stainless Steel'}, 
    {label:'Brushed Steel'}, 
    {label:'Copper Patina'}, 
    {label:'Dark Bronze'}, 
    {label:'Distressed White'}, 
    {label:'Flat Black'}, 
    {label:'Green Patina'}, 
    {label:'Oil Rubbed Bronze'}, 
    {label:'White'}, 
    {label:'Warehouse Bronze'}, 
    {label:'Weathered Rust'}, 
]; 

var wheelFinishes = finishes; 

Как вы можете видеть, что установка другой массив объектов, который будет иметь некоторые различные атрибуты, то есть «семенной» массив объектов.

Так что я хочу сделать что-то вроде:

UPDATE wheelFinishes WHERE label="Barn Red" SET exclusion="Metal Values"

Таким образом, значение wheelFinishes бы в конечном итоге, как:

var wheelFinishes = [ 
    {label:'Raw Steel'}, 
    {label:'Antique Pewter'}, 
    {label:'Barn Red', exclusion:'Metal Values'}, 
    {label:'Brushed Stainless Steel'}, 
    {label:'Brushed Steel'}, 
    {label:'Copper Patina'}, 
    {label:'Dark Bronze'}, 
    {label:'Distressed White'}, 
    {label:'Flat Black'}, 
    {label:'Green Patina'}, 
    {label:'Oil Rubbed Bronze'}, 
    {label:'White'}, 
    {label:'Warehouse Bronze'}, 
    {label:'Weathered Rust'}, 
]; 

Я не уверен на фактическом синтаксису обновить массив объектов в javascript.

Я знаю, что у underscorejs могут быть некоторые функции, которые упрощают этот тип вещей, поэтому я открыт для решения в underscorejs, если это возможно?

+2

Это может быть разработан с '.find()' https://developer.mozilla.org/en-US/ docs/Web/JavaScript/Reference/Global_Objects/Array/find –

ответ

2

Перейдите через массив и добавьте свойство.

Используйте функцию update. Я принимаю набор элементов ярлыков, которые необходимо изменить. Под каждым набором меток есть еще один набор для добавления.

var finishes = [{ 
 
    label: 'Raw Steel' 
 
}, { 
 
    label: 'Antique Pewter' 
 
}, { 
 
    label: 'Barn Red' 
 
}, { 
 
    label: 'Brushed Stainless Steel' 
 
}, { 
 
    label: 'Brushed Steel' 
 
}, { 
 
    label: 'Copper Patina' 
 
}, { 
 
    label: 'Dark Bronze' 
 
}, { 
 
    label: 'Distressed White' 
 
}, { 
 
    label: 'Flat Black' 
 
}, { 
 
    label: 'Green Patina' 
 
}, { 
 
    label: 'Oil Rubbed Bronze' 
 
}, { 
 
    label: 'White' 
 
}, { 
 
    label: 'Warehouse Bronze' 
 
}, { 
 
    label: 'Weathered Rust' 
 
}, ]; 
 

 
function update(arr) { 
 
    var i, len, len2, len3, elem, j, k, key, value; 
 
    for (i = 0, len = arr.length; i < len; i += 1) { 
 
    elem = arr[i]; 
 
    for (j = 0, len2 = finishes.length; j < len2; j += 1) { 
 
     if (finishes[j].label === elem.label) { 
 
     for (k = 0, len3 = elem.set.length; k < len3; k += 1) { 
 
      key = elem.set[k].key; 
 
      value = elem.set[k].value; 
 
      finishes[j][key] = value; 
 
     } 
 
     } 
 
    } 
 
    } 
 
    return finishes; 
 
} 
 

 
console.log(update([{ 
 
    label: 'Barn Red', 
 
    set: [{ 
 
    key: 'exclusion1', 
 
    value: 'Metal Values1' 
 
    }, { 
 
    key: 'exclusion2', 
 
    value: 'Metal Values2' 
 
    }] 
 
}]));

+0

Я пытаюсь написать функцию, которая может сделать это очень быстро для различных приложений – Jordash

+0

Да, это обновление только, проверьте ... мы можем сделать это больше generalize ... – Ayan

+0

@Jordash Теперь проверьте, его полностью обобщенно сейчас. Кормите его динамически. Проверьте использование функции обновления. Вы просите найти эти ярлыки под каждым набором меток, задайте эти наборы свойств. – Ayan

1

Вы можете использовать, например, регулярно forEach для этого:

var finishes = [ 
 
    {label:'Raw Steel'}, 
 
    {label:'Antique Pewter'}, 
 
    {label:'Barn Red'}, 
 
    {label:'Brushed Stainless Steel'}, 
 
    {label:'Brushed Steel'}, 
 
    {label:'Copper Patina'}, 
 
    {label:'Dark Bronze'}, 
 
    {label:'Distressed White'}, 
 
    {label:'Flat Black'}, 
 
    {label:'Green Patina'}, 
 
    {label:'Oil Rubbed Bronze'}, 
 
    {label:'White'}, 
 
    {label:'Warehouse Bronze'}, 
 
    {label:'Weathered Rust'}, 
 
]; 
 
    
 
finishes.forEach(function(f) { 
 
    if(f.label === 'Barn Red') { 
 
    f.exclusion = 'Metal Values'; 
 
    } 
 
}); 
 
    
 
console.log(finishes);

2

с использованием Array.prototype.map бы один (из нескольких) возможных решений:

var wheelFinishes = [ 
 
    {label:'Raw Steel'}, 
 
    {label:'Antique Pewter'}, 
 
    {label:'Barn Red'}, 
 
    {label:'Brushed Stainless Steel'}, 
 
    {label:'Brushed Steel'}, 
 
    {label:'Copper Patina'}, 
 
    {label:'Dark Bronze'}, 
 
    {label:'Distressed White'}, 
 
    {label:'Flat Black'}, 
 
    {label:'Green Patina'}, 
 
    {label:'Oil Rubbed Bronze'}, 
 
    {label:'White'}, 
 
    {label:'Warehouse Bronze'}, 
 
    {label:'Weathered Rust'}, 
 
]; 
 

 
//extend all objects having a specific label 
 
updatedFinishes = wheelFinishes.map(function(obj) { 
 
    if(obj.label === 'Barn Red') { 
 
    obj.exclusion = 'Metal Values'; 
 
    } 
 
    return obj; 
 
}); 
 
    
 
//test 
 
updatedFinishes.forEach(function(obj) { 
 
    console.log(obj); 
 
})

2

Обратите внимание, что, в отличие от карты(), это работает только для r первый элемент с {label: 'Barn Red'} в массиве.

Как было предложено @RobertRocha:

var wheelFinishes = finishes.slice(); 
wheelFinishes.find(function (finish) { 
    return finish.label === 'Barn Red'; 
}).exclusion = 'Metal Values'; 

Это copies массив с помощью slice, то finds деталь с .label === 'Barn Red'.


В ES6:

const wheelFinishes = finishes.slice(); 
wheelFinishes 
    .find(finish => finish.label === 'Barn Red') 
    .exclusion = 'Metal Values'; 
2

Чтобы сделать его совместимым с концепцией

UPDATE wheelFinishes WHERE метка = SET "Barn Красный" запретных = "Металлические значения"

и сделать его свободно связанным/независимым как возможно BLE, здесь есть функция, которая может помочь вам:

var finishes = [ 
    {label:'Raw Steel'}, 
    {label:'Antique Pewter'}, 
    {label:'Barn Red'}, 
    {label:'Brushed Stainless Steel'}, 
    {label:'Brushed Steel'}, 
    {label:'Copper Patina'}, 
    {label:'Dark Bronze'}, 
    {label:'Distressed White'}, 
    {label:'Flat Black'}, 
    {label:'Green Patina'}, 
    {label:'Oil Rubbed Bronze'}, 
    {label:'White'}, 
    {label:'Warehouse Bronze'}, 
    {label:'Weathered Rust'}, 
    ]; 

    var wheelFinishes = finishes; 

    function update(table, searchItem, setValue) { 
     function search(table) { 
      if(table.label == searchItem) { 
       table.exclusion = setValue; 
      } 
     } 

     table.find(search); 
    } 

    update(wheelFinishes, 'Barn Red', 'Metal Values'); 

    console.log(wheelFinishes[2]); 

Результат: Object {label: "Barn Red", exclusion: "Metal Values"}

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