根据 属性 名称对数组中的对象进行分组

Grouping Objects In Array Based On Property Name

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

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;

如果满足条件,则对其中的每一个执行 .push。

尝试过:

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

更新:

使用 Object.keys 总是遇到其他情况:

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);

您可以使用 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 数组对象有一个 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;
}

一个没有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>');