Filter an object object in javascript (filter or reduce?)
Filter an object object in javascript (filter or reduce?)
过滤或减少对象的最佳做法是什么?我会通过 for 循环完成此操作并创建一个新数组,但我明白您可以通过过滤器 属性 in JavaScript?
以某种方式完成此操作
var myObject = [
{dimensions: [451, 255], margins: [0, 2, 0, 29]},
{dimensions: [222, 390], margins: [0, 5, 0, 37]},
{dimensions: [333, 390], margins: [0, 8, 0, 37]}
];
我想分别过滤掉数组中的第一个维度 属性 和第二个和第四个边距 属性 以具有:
var dimension = [ 451, 222, 333 ];
var margins = [ 2, 29, 5, 37, 8, 37 ];
另外,如果我过滤一个对象并更新这些变量,有没有办法将它们映射回来?或者我应该像下面这样在之后映射:
var dimension = [ a: 451, b: 222, c: 333];
var margins = [ a: [2, 29], b : [5, 37], c: [8, 37] ];
如果您只想要满足某些条件的数组的一个子集(例如任意数字数组中大于 5 的所有数字),则过滤效果很好。在你的情况下,我肯定会去循环。
var myObject = [
{dimensions: [451, 255], margins: [0, 2, 0, 29]},
{dimensions: [222, 390], margins: [0, 5, 0, 37]},
{dimensions: [333, 390], margins: [0, 8, 0, 37]}
]
var dimensions = [];
var margins = [];
myObject.forEach(function(item) {
dimensions.push(item.dimensions[0]);
margins.push(item.margins[1]);
margins.push(item.margins[3]);
// or by using concat():
// dimensions = dimensions.push(item.dimensions[0]);
// margins = margins.concat([item.margins[1], item.margins[3]]);
});
console.log("dimensions:", dimensions);
console.log("margins:", margins);
您可以使用 reduce
:
var myObject = [{
dimensions: [451, 255],
margins: [0, 2, 0, 29]
}, {
dimensions: [222, 390],
margins: [0, 5, 0, 37]
}, {
dimensions: [333, 390],
margins: [0, 8, 0, 37]
}];
var results = myObject.reduce(function(acc, item) {
acc.dimensions.push(item.dimensions[0]);
acc.margins.push(item.margins[1], item.margins[3]);
return acc;
}, { dimensions: [], margins: [] });
console.log(results); // {dimensions: Array[3], margins: Array[6]}
工作fiddle:https://jsfiddle.net/9ynez03c/
映射回myObject
:
var dimensions = results.dimensions;
var margins = results.margins;
var updateMyObject = function() {
myObject.forEach(function(item, i) {
item.dimensions[0] = dimensions[i];
item.margins[1] = margins[i * 2];
item.margins[3] = margins[i * 2 + 1];
})
};
updateMyObject();
这很笨拙。我不确定你是如何使用这些数据的,但有些东西告诉我你应该首先使用一个对象,然后根据需要使用 accessing/updating 属性,而不是创建额外的数组。
新 fiddle 更新:https://jsfiddle.net/adrice727/g01s80qf/
过滤或减少对象的最佳做法是什么?我会通过 for 循环完成此操作并创建一个新数组,但我明白您可以通过过滤器 属性 in JavaScript?
以某种方式完成此操作var myObject = [
{dimensions: [451, 255], margins: [0, 2, 0, 29]},
{dimensions: [222, 390], margins: [0, 5, 0, 37]},
{dimensions: [333, 390], margins: [0, 8, 0, 37]}
];
我想分别过滤掉数组中的第一个维度 属性 和第二个和第四个边距 属性 以具有:
var dimension = [ 451, 222, 333 ];
var margins = [ 2, 29, 5, 37, 8, 37 ];
另外,如果我过滤一个对象并更新这些变量,有没有办法将它们映射回来?或者我应该像下面这样在之后映射:
var dimension = [ a: 451, b: 222, c: 333];
var margins = [ a: [2, 29], b : [5, 37], c: [8, 37] ];
如果您只想要满足某些条件的数组的一个子集(例如任意数字数组中大于 5 的所有数字),则过滤效果很好。在你的情况下,我肯定会去循环。
var myObject = [
{dimensions: [451, 255], margins: [0, 2, 0, 29]},
{dimensions: [222, 390], margins: [0, 5, 0, 37]},
{dimensions: [333, 390], margins: [0, 8, 0, 37]}
]
var dimensions = [];
var margins = [];
myObject.forEach(function(item) {
dimensions.push(item.dimensions[0]);
margins.push(item.margins[1]);
margins.push(item.margins[3]);
// or by using concat():
// dimensions = dimensions.push(item.dimensions[0]);
// margins = margins.concat([item.margins[1], item.margins[3]]);
});
console.log("dimensions:", dimensions);
console.log("margins:", margins);
您可以使用 reduce
:
var myObject = [{
dimensions: [451, 255],
margins: [0, 2, 0, 29]
}, {
dimensions: [222, 390],
margins: [0, 5, 0, 37]
}, {
dimensions: [333, 390],
margins: [0, 8, 0, 37]
}];
var results = myObject.reduce(function(acc, item) {
acc.dimensions.push(item.dimensions[0]);
acc.margins.push(item.margins[1], item.margins[3]);
return acc;
}, { dimensions: [], margins: [] });
console.log(results); // {dimensions: Array[3], margins: Array[6]}
工作fiddle:https://jsfiddle.net/9ynez03c/
映射回myObject
:
var dimensions = results.dimensions;
var margins = results.margins;
var updateMyObject = function() {
myObject.forEach(function(item, i) {
item.dimensions[0] = dimensions[i];
item.margins[1] = margins[i * 2];
item.margins[3] = margins[i * 2 + 1];
})
};
updateMyObject();
这很笨拙。我不确定你是如何使用这些数据的,但有些东西告诉我你应该首先使用一个对象,然后根据需要使用 accessing/updating 属性,而不是创建额外的数组。
新 fiddle 更新:https://jsfiddle.net/adrice727/g01s80qf/