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

时间:2016-03-10 17:45:45

标签: javascript arrays javascript-objects

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

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'的上述和组对象以及不包含{?1}的对象?

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

var cartObj;
var nonCartObj;

如果符合条件,则执行.push到每个。

尝试:

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

更新

使用Object.keys总是遇到else case:

var key = Object.keys(item);

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

4 个答案:

答案 0 :(得分:3)

您可以使用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;
    });
}

答案 1 :(得分:2)

循环遍历数组的每个项目,然后在该循​​环内迭代对象键以找到您要查找的内容

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

console.log(result);

答案 2 :(得分:0)

JavaScript Array对象有filter function可用于此目的。

棘手的部分是执行过滤的功能。一种方法是迭代对象中的键以检测哪些键包含" 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}},
    {"tel": 7778798548}
];

var cartObj = myArray.filter(function (x) { return isCart(x); });
var nonCartObj = myArray.filter(function (x) { return !isCart(x); });

console.log("cart count = " + cartObj.length + ", non-cart count = " + nonCartObj.length);

function isCart(x) {
  for (var key in x) {
    if (x.hasOwnProperty(key) && key.startsWith("cart")) {
      return true;
    }
  }
  return false;
}




答案 3 :(得分:0)

一个没有Array#filter()的循环的解决方案。



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 }],
    grouped = function (array) {
        var r = { cart: [], nonCart: [] };
        array.forEach(function (a) {
            Object.keys(a).some(function (k) {
                if (k.indexOf('cart') === 0) {
                    return r.cart.push(a);
                }
            }) || r.nonCart.push(a);
        });
        return r;
    }(myArray);

document.write('<pre>' + JSON.stringify(grouped, 0, 4) + '</pre>');
&#13;
&#13;
&#13;