我怎样才能循环并削减一个物体?

时间:2017-06-05 20:06:09

标签: javascript object

如果我有以下内容:

{
    prop: "X",
    something: "Apple"
},
{
    prop: "X",
    something: "Apple"    
},
{
    prop: "Y",
    something: "Banana"
},
{
    prop: "Y",
    something: "Banana"
}

如何将其转换为看起来像这样的新对象?

{
    prop: "X",
    apple: 2
},
{
    prop: "Y",
    banana: 2
}

2 个答案:

答案 0 :(得分:1)

Array.prototype.reduce可以在这里提供帮助:

let data = [{
    prop: "X",
    something: "Apple"
},
{
    prop: "X",
    something: "Apple"    
},
{
    prop: "Y",
    something: "Banana"
},
{
    prop: "Y",
    something: "Banana"
}];

let newData = data.reduce((prev, curr) => {
  prev[curr.prop] = prev[curr.prop] || {};
  
  let lowercaseKey = curr.something.toLowerCase();
  
  
  prev[curr.prop][lowercaseKey] = prev[curr.prop][lowercaseKey] ? prev[curr.prop][lowercaseKey] + 1 : 1;
  prev[curr.prop].prop = curr.prop;

  return prev;
}, {});

newData = Object.keys(newData).map(key => newData[key]);

console.log(newData);

基本上,它使用一个对象作为累加器(reduce函数的最后一个参数)来跟踪数组中每个项的总值(这是有益的,而不是只是立即推送到一个新数组,因为你首先必须为reduce函数的每次迭代迭代新数组,以查找对象是否已存在。然后,最后,我们再次迭代新对象的所有键,并获取值。

专业提示:如果您使用上面的代码段并在每次迭代期间记录值,则更容易理解。

答案 1 :(得分:0)

您可以使用带有闭包的单循环方法,使用哈希表来收集具有相同prop密钥的对象。



var data = [{ prop: "X", something: "Apple" }, { prop: "X", something: "Apple" }, { prop: "Y", something: "Banana" }, { prop: "Y", something: "Banana" }],
    result = data.reduce(function (hash) {
        return function (r, a) {
            var k2 = a.something.toLowerCase();
            if (!hash[a.prop]) {
                hash[a.prop] = { prop: a.prop };
                hash[a.prop][k2] = 0;
                r.push(hash[a.prop]);
            }
            hash[a.prop][k2]++;
            return r;
        };
    }(Object.create(null)), []);

console.log(result);

.as-console-wrapper { max-height: 100% !important; top: 0; }




要计算更多属性



var data = [{ prop: "X", something: "Apple", somethingElse: "Orange" }, { prop: "X", something: "Apple" }, { prop: "Y", something: "Banana" }, { prop: "Y", something: "Banana" }],
    result = data.reduce(function (hash) {
        return function (r, o) {
            if (!hash[o.prop]) {
                hash[o.prop] = { prop: o.prop };
                r.push(hash[o.prop]);
            }
            Object.keys(o).forEach(function (k) {
                var k2 = o[k].toLowerCase();
                if (k !== 'prop') {
                    hash[o.prop][k2] = (hash[o.prop][k2] || 0) + 1;
                }
            });
            return r;
        };
    }(Object.create(null)), []);

console.log(result);

.as-console-wrapper { max-height: 100% !important; top: 0; }