Javascript 基于属性名对数组中的对象进行分组

Javascript 基于属性名对数组中的对象进行分组,javascript,arrays,javascript-objects,Javascript,Arrays,Javascript Objects,我有一个包含对象列表的数组: var myArray = [ {"cartItems": {"paramA1": 25, "paramA2": 35}}, {"cartShippingCost": {"paramB1": 4, "paramB2": 152, "paramB3": 536, "paramB4": 56}}, {"cartSpecialRequirements": {"paramC1": 432}}, {"cartPostage": {"paramD

我有一个包含对象列表的数组:

var myArray = [
    {"cartItems": {"paramA1": 25, "paramA2": 35}},
    {"cartShippingCost": {"paramB1": 4, "paramB2": 152, "paramB3": 536, "paramB4": 56}},
    {"cartSpecialRequirements": {"paramC1": 432}},
    {"cartPostage": {"paramD1": 56, "paramD2": 6537}},
    {"uid": {"paramE1": 545}},
    {"tel": 7778798548}
];
如何循环浏览上述内容,并将包含
'cart'
的对象与不包含的对象分组

我知道我需要创建2个临时对象,例如

var cartObj;
var nonCartObj;
并在满足条件的情况下,将其推入

尝试:

for(var i in myArray) { 
    if (i == 'cart') {
        console.log('cart match found');
    }
}
更新:

使用Object.keys始终按else键大小写:

var key = Object.keys(item);

if (key.indexOf("cart") !== -1) {
    alert(key + " contains cart");
} else {
    alert(key + " doesnt contain cart");
}

循环遍历数组的每个项,然后在该循环中迭代对象键以查找所需内容

var result = [];
myArray.forEach(function (item) {
  for (var key in item) {
     if (key.indexOf('cart') !== -1) {
        result.push(item);
     }
  }
});

console.log(result);

循环遍历数组的每个项,然后在该循环中迭代对象键以查找所需内容

var result = [];
myArray.forEach(function (item) {
  for (var key in item) {
     if (key.indexOf('cart') !== -1) {
        result.push(item);
     }
  }
});

console.log(result);

您可以使用
Array.prototype.filter
创建一个新数组,其中每个项目都满足某些条件:

var cartItems = myArray.filter(hasCartProperty);
var nonCartItems = myArray.filter(function (x) { return !hasCartProperty(x); });


// Checks to see if any of the object's keys contain the text 'cart'
function hasCartProperty(x) {
    return Object.keys(x).some(function (x) {
        return x.indexOf('cart') > -1;
    });
}

您可以使用
Array.prototype.filter
创建一个新数组,其中每个项目都满足某些条件:

var cartItems = myArray.filter(hasCartProperty);
var nonCartItems = myArray.filter(function (x) { return !hasCartProperty(x); });


// Checks to see if any of the object's keys contain the text 'cart'
function hasCartProperty(x) {
    return Object.keys(x).some(function (x) {
        return x.indexOf('cart') > -1;
    });
}

JavaScript数组对象具有一个可用于此操作的

棘手的部分是执行过滤的函数。一种方法是迭代对象中的键,以检测哪些键包含“cart”键

var myArray=[
{“cartItems”:{“paramA1”:25,“paramA2”:35},
{“cartShippingCost”:{“paramB1”:4,“paramB2”:152,“paramB3”:536,“paramB4”:56},
{“cartSpecialRequirements”:{“paramC1”:432},
{“cartPostage”:{“paramD1”:56,“paramD2”:6537},
{“uid”:{“paramE1”:545},
{“电话”:7778798548}
];
var cartObj=myArray.filter(函数(x){return isCart(x);});
var nonCartObj=myArray.filter(函数(x){return!isCart(x);});
console.log(“购物车计数=“+cartObj.length+”,非购物车计数=“+nonCartObj.length”);
函数isCart(x){
for(x中的var键){
if(x.hasOwnProperty(key)和&key.startsWith(“cart”)){
返回true;
}
}
返回false;

}
JavaScript数组对象具有一个可用于此操作的

棘手的部分是执行过滤的函数。一种方法是迭代对象中的键,以检测哪些键包含“cart”键

var myArray=[
{“cartItems”:{“paramA1”:25,“paramA2”:35},
{“cartShippingCost”:{“paramB1”:4,“paramB2”:152,“paramB3”:536,“paramB4”:56},
{“cartSpecialRequirements”:{“paramC1”:432},
{“cartPostage”:{“paramD1”:56,“paramD2”:6537},
{“uid”:{“paramE1”:545},
{“电话”:7778798548}
];
var cartObj=myArray.filter(函数(x){return isCart(x);});
var nonCartObj=myArray.filter(函数(x){return!isCart(x);});
console.log(“购物车计数=“+cartObj.length+”,非购物车计数=“+nonCartObj.length”);
函数isCart(x){
for(x中的var键){
if(x.hasOwnProperty(key)和&key.startsWith(“cart”)){
返回true;
}
}
返回false;

}
一个具有一个循环的解决方案,没有
数组#过滤器()

var myArray=[{“cartItems”:{“paramA1”:25,“paramA2”:35},{“cartShippingCost”:{“paramB1”:4,“paramB2”:152,“paramB3”:536,“paramB4”:56},{“cartSpecialRequirements”:{“paramC1”:432},{“cartPostage”:{“paramD1”:56,“paramD2”:6537},{“uid”:{“paramE1”:545},{“电话”:7778798548},
分组=函数(数组){
var r={cart:[],nonCart:[]};
array.forEach(函数(a){
对象。键(a)。一些(函数(k){
if(k.indexOf('cart')==0){
返回右推车推(a);
}
})| | r.非起动推力(a);
});
返回r;
}(myArray);

document.write(“”+JSON.stringify(分组,0,4)+“”)
一个解决方案,其中有一个循环,没有
数组#过滤器()

var myArray=[{“cartItems”:{“paramA1”:25,“paramA2”:35},{“cartShippingCost”:{“paramB1”:4,“paramB2”:152,“paramB3”:536,“paramB4”:56},{“cartSpecialRequirements”:{“paramC1”:432},{“cartPostage”:{“paramD1”:56,“paramD2”:6537},{“uid”:{“paramE1”:545},{“电话”:7778798548},
分组=函数(数组){
var r={cart:[],nonCart:[]};
array.forEach(函数(a){
对象。键(a)。一些(函数(k){
if(k.indexOf('cart')==0){
返回右推车推(a);
}
})| | r.非起动推力(a);
});
返回r;
}(myArray);

document.write(“”+JSON.stringify(分组,0,4)+“”)谢谢,我做了一些程序,我用Object.keys代替了for循环。。。每个?@OamPsy Object.keys的优缺点都更好,因为它不会迭代像
toString
这样的属性。我只是选择保持简单。:)我使用Object.keys添加了一个更新,但它总是命中else语句。不管怎样,我都会把上面的答案标记为答案,但是任何关于Object.keys的帮助都将不胜感激。谢谢,我做了一些程序,而不是你的for循环,我使用了Object.keys。。。每个?@OamPsy Object.keys的优缺点都更好,因为它不会迭代像
toString
这样的属性。我只是选择保持简单。:)我使用Object.keys添加了一个更新,但它总是命中else语句。不管怎样,我都会将以上内容作为答案,但如果您能提供Object.keys方面的任何帮助,我们将不胜感激。@CalvinBelden-谢谢,但isnt=>仅在ES6中提供。那么ES5呢?事实上,这是一个有趣的选择,它只用于一个人而不是另一个人other@CalvinBelden-谢谢,但isnt=>仅在ES6中可用。那么ES5呢?事实上,这是一个有趣的选择,一个是使用它,另一个不是