从数组和对象

时间:2016-07-04 19:08:34

标签: javascript

我的阵列:

var categories =  [
    ["low"],
    ["medium low", "medium medium", "medium high"],
    ["high low", "high medium", "high high", "high obscene"]
 ];

我的对象:

var values = {
  abc: {
    3: ["a", "b", "c"],
    4: ["m", "n", "o", "p"].
    5: ["v", "w", "x", "y", "z"]
  },
  def: {
    3: ["a1", "b2", "c1"],
    4: ["m7", "n5", "o8", "p3"].
    5: ["v6", "w7", "x4", "y5", "z9"]
  },
  xyz: {
    3: ["a3", "b4", "c6"],
    4: ["m6", "n3", "o7", "p1"].
    5: ["v3", "w9", "x2", "y7", "z8"]
  }
}

这就是我想要做的。

a)对于categories数组中的每个数组,我将其与values对象匹配  categories中的第一个数组与values中的第一个对象匹配,依此类推。

因此["low"]values.abc中的值匹配。

b)现在,我需要在["low"]的情况下检查数组中的元素的数量,它只是一个

c)现在我检查values.abc中的最小数字键(此处为3)并将其与数组匹配以获取对象{"name":"low","value":"a"}

d)下一个数组["medium low", "medium medium", "medium high"]values.def中的值匹配。 这里,数组的长度为3,并将其与我们得到的最小数字键3匹配,并生成三个对象。{"name":"medium low","value":"a1"},{"name":"medium medium","value":"b2"},{"name":"medium high","value":"c1"}

e)类似下一个数组的长度为4,并将其与values.xyz的数字键4的值相匹配,我们生成四个对象.. {"name":"high low","value":"m6"},{"name":"high medium","value":"n3"},{"name":"high high","value":"o7"},{"name":"high obscene","value":"p1"}

所以结果应该是:

var results = [{
  "name": "low",
  "value": "a"
}, {
  "name": "medium low",
  "value": "a1"
}, {
  "name": "medium medium",
  "value": "b2"
}, {
  "name": "medium high",
  "value": "c1"
}, {
  "name": "high low",
  "value": "m6"
}, {
  "name": "high medium",
  "value": "n3"
}, {
  "name": "high high",
  "value": "o7"
}, {
  "name": "high obscene",
  "value": "p1"
}]

我能够弄清楚......

 var results = categories.forEach(myFunction);

function myFunction(item, index) {
    var l = item.length;
//I need to figure out based on index get the reqd object in values
// Also based on above var l, get the right array against the numeric key 
}

2 个答案:

答案 0 :(得分:1)

使用Object.keysArray.forEachArray.indexOf函数的解决方案:

var categories =  [
    ["low"],
    ["medium low", "medium medium", "medium high"],
    ["high low", "high medium", "high high", "high obscene"]
 ];
 
 var values = {
  abc: {
    3: ["a", "b", "c"],
    4: ["m", "n", "o", "p"],
    5: ["v", "w", "x", "y", "z"]
  },
  def: {
    3: ["a1", "b2", "c1"],
    4: ["m7", "n5", "o8", "p3"],
    5: ["v6", "w7", "x4", "y5", "z9"]
  },
  xyz: {
    3: ["a3", "b4", "c6"],
    4: ["m6", "n3", "o7", "p1"],
    5: ["v3", "w9", "x2", "y7", "z8"]
  }
};

var valuesKeys = Object.keys(values), 
    result = [];

categories.forEach(function (v, k) {
    var size = String(v.length),
        inner_obj = values[valuesKeys[k]],
        inner_keys = Object.keys(inner_obj),
        matches_item = (inner_keys.indexOf(size) !== -1)? inner_obj[size] : inner_obj[Math.min.apply(null, inner_keys)];
        
    v.forEach(function (name, k) {
        result.push({name: name, value: matches_item[k]});    
    });
})

console.log(JSON.stringify(result, 0, 4));

答案 1 :(得分:1)

你可以迭代并收集想要的部分。

var categories = [["low"], ["medium low", "medium medium", "medium high"], ["high low", "high medium", "high high", "high obscene"]],
    values = { abc: { 3: ["a", "b", "c"], 4: ["m", "n", "o", "p"], 5: ["v", "w", "x", "y", "z"] }, def: { 3: ["a1", "b2", "c1"], 4: ["m7", "n5", "o8", "p3"], 5: ["v6", "w7", "x4", "y5", "z9"] }, xyz: { 3: ["a3", "b4", "c6"], 4: ["m6", "n3", "o7", "p1"], 5: ["v3", "w9", "x2", "y7", "z8"] } },
    order = Object.keys(values).sort(),
    result = categories.reduce(function (r, a, i) {
        var keys = Object.keys(values[order[i]]).sort(function (a, b) { return a - b; });
        return r.concat(a.map(function (b, j) {
            return {
                name: b,
                value: (values[order[i]][a.length] || values[order[i]][keys[0]])[j]
            };
        }));
    }, []);

console.log(result);