jQuery 更改对象数组中任意键的值
jQuery change values of any key of an array of objects
我通过 AJAX 导入了一个数组。
我想基于原始数组创建一个新数组并扫描整个新数组以清除与其关联的键的值。
导入的数据集如下所示:
[
{id:"1", color:"red_blue", height:"100_200" },
{id:"2", color:"green", height:"100_20" },
{id:"3", color:"orange_yellow", height:"50" }
]
jQuery 流程如下所示
dataSet = JSON.parse(response);
// create a new array based on the imported array
var row = 0;
$.each(dataSet, function(key, value) {
cleanDataSet.push(dataSet[row]);
row++;
});
// clean the new array
var row = 0;
// Go through each row of the array
$.each(cleanDataSet, function(key, value) {
// Go through each key and value of this array
$.each(cleanDataSet[row], function(key, value) {
var myVariable = thisValueWhateverTheKey.split('_');
// if a split is detected in the value
if (myVariable[1]) {
// Update the value
thisValueWhateverTheKey = myVariable[0];
}
row++;
});
});
console.log(cleanDataSet)
"thisValueWhateverTheKey"
部分显然是我想不通的部分。
当我以特定键的值为目标时很容易(我会使用 "value.nameofmykey"
但当我以任何键的任何值为目标时不会那么多。单独使用 "value" 是行不通的。
您可以直接使用 value
,很可能您对在两个循环中使用 key, value
感到困惑。另请注意,您正在拆分双下划线 __
,根据您的数据,它需要是单个下划线 _
。
以下是简化方法:
$.each(cleanDataSet, function(index, cleanDataSetRow){
// Go through each key and value of this array
$.each(cleanDataSetRow, function(key, value){
var myVariable = value.split('_');
// if a split is detected in the value
if(myVariable[1]){
// Update the value
cleanDataSetRow[key] = myVariable[0];
}
});
});
我认为您的 code/question 有点令人困惑 - 如果我理解正确的话,您想要这样的东西。请注意,map
函数创建了一个新数组,其中填充了对调用数组中的每个元素调用提供的函数的结果。例如
const data = [{
id: "1",
color: "red_blue",
height: "100_200"
},
{
id: "2",
color: "green",
height: "100_20"
},
{
id: "3",
color: "orange_yellow",
height: "50"
}
]
const clean = data.map(x => {
// x is each object in the original array
// i.e. data[0], data[1], etc
for (y in x) {
// y is each property in the object
// e.g. data[0]["id"], data[0]["color"], etc
// so here we are setting the value of each property of each object
x[y] = x[y].split('_')[0]
}
// finally return each modified object
return x;
})
// so clean is a new array based on data
// where each property has been set to the correct value
console.log(clean)
如果这不正确,您能否编辑您的问题以包含您希望数据如何显示的示例 - 即 before/after。
当您遍历每个对象时,使用 Object.entries()
并销毁每个条目(例如 [key, value]
):
...
Object.entries(obj).forEach(([key, val]) => {
if (val === value) {
obj[key] = ''
}
...
let data = [
{id:"1", color:"red_blue", height:"100_200" },
{id:"2", color:"green", height:"100_20" },
{id:"3", color:"orange_yellow", height:"50" }
];
function removeValue(objectArray, value) {
objectArray.forEach(obj => {
Object.entries(obj).forEach(([key, val]) => {
if (val === value) {
obj[key] = '';
}
});
});
return objectArray;
}
console.log(removeValue(data, "100_20"));
console.log(removeValue(data, "orange_yellow"));
const data = [
{
id: "1",
color: "red_blue",
height: "100_200"
},
{
id: "2",
color: "green",
height: "100_20"
},
{
id: "3",
color: "orange_yellow",
height: "50"
}
];
var clean = data.map(item => Object.fromEntries(
Object.keys(item).map(key => [key, item[key].split('_')[0]])
));
console.log(clean);
我通过 AJAX 导入了一个数组。 我想基于原始数组创建一个新数组并扫描整个新数组以清除与其关联的键的值。
导入的数据集如下所示:
[
{id:"1", color:"red_blue", height:"100_200" },
{id:"2", color:"green", height:"100_20" },
{id:"3", color:"orange_yellow", height:"50" }
]
jQuery 流程如下所示
dataSet = JSON.parse(response);
// create a new array based on the imported array
var row = 0;
$.each(dataSet, function(key, value) {
cleanDataSet.push(dataSet[row]);
row++;
});
// clean the new array
var row = 0;
// Go through each row of the array
$.each(cleanDataSet, function(key, value) {
// Go through each key and value of this array
$.each(cleanDataSet[row], function(key, value) {
var myVariable = thisValueWhateverTheKey.split('_');
// if a split is detected in the value
if (myVariable[1]) {
// Update the value
thisValueWhateverTheKey = myVariable[0];
}
row++;
});
});
console.log(cleanDataSet)
"thisValueWhateverTheKey"
部分显然是我想不通的部分。
当我以特定键的值为目标时很容易(我会使用 "value.nameofmykey"
但当我以任何键的任何值为目标时不会那么多。单独使用 "value" 是行不通的。
您可以直接使用 value
,很可能您对在两个循环中使用 key, value
感到困惑。另请注意,您正在拆分双下划线 __
,根据您的数据,它需要是单个下划线 _
。
以下是简化方法:
$.each(cleanDataSet, function(index, cleanDataSetRow){
// Go through each key and value of this array
$.each(cleanDataSetRow, function(key, value){
var myVariable = value.split('_');
// if a split is detected in the value
if(myVariable[1]){
// Update the value
cleanDataSetRow[key] = myVariable[0];
}
});
});
我认为您的 code/question 有点令人困惑 - 如果我理解正确的话,您想要这样的东西。请注意,map
函数创建了一个新数组,其中填充了对调用数组中的每个元素调用提供的函数的结果。例如
const data = [{
id: "1",
color: "red_blue",
height: "100_200"
},
{
id: "2",
color: "green",
height: "100_20"
},
{
id: "3",
color: "orange_yellow",
height: "50"
}
]
const clean = data.map(x => {
// x is each object in the original array
// i.e. data[0], data[1], etc
for (y in x) {
// y is each property in the object
// e.g. data[0]["id"], data[0]["color"], etc
// so here we are setting the value of each property of each object
x[y] = x[y].split('_')[0]
}
// finally return each modified object
return x;
})
// so clean is a new array based on data
// where each property has been set to the correct value
console.log(clean)
如果这不正确,您能否编辑您的问题以包含您希望数据如何显示的示例 - 即 before/after。
当您遍历每个对象时,使用 Object.entries()
并销毁每个条目(例如 [key, value]
):
...
Object.entries(obj).forEach(([key, val]) => {
if (val === value) {
obj[key] = ''
}
...
let data = [
{id:"1", color:"red_blue", height:"100_200" },
{id:"2", color:"green", height:"100_20" },
{id:"3", color:"orange_yellow", height:"50" }
];
function removeValue(objectArray, value) {
objectArray.forEach(obj => {
Object.entries(obj).forEach(([key, val]) => {
if (val === value) {
obj[key] = '';
}
});
});
return objectArray;
}
console.log(removeValue(data, "100_20"));
console.log(removeValue(data, "orange_yellow"));
const data = [
{
id: "1",
color: "red_blue",
height: "100_200"
},
{
id: "2",
color: "green",
height: "100_20"
},
{
id: "3",
color: "orange_yellow",
height: "50"
}
];
var clean = data.map(item => Object.fromEntries(
Object.keys(item).map(key => [key, item[key].split('_')[0]])
));
console.log(clean);