2016-08-06 46 views
2

我有对象的数组,看起来像这样:更新数组,其中字段是特定值

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

是的,只是更新它,检查...我们可以使它更多概括... – 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

需要注意的是,不像地图(),这只适用于fo第一个项目是{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排除= “金属 值”

并使其如同松散耦合/独立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"}