从concat数组中获取值

时间:2013-11-22 08:13:21

标签: javascript arrays json

我将两个json数组连接起来。

JAVASCRIPT

var json_from_data = [{acceleration: 15,
              cylinders: 4,
              displacement: 98,
              horsepower: 80,
              id: 90,
              model_year: 72,
              mpg: 28,
              name: "dodge colt (sw)",
              origin: 1,
              weight: 2164},

{acceleration: 14,
cylinders: 8,
displacement: 307,
horsepower: 130,
id: 80,
model_year: 72,
mpg: 13,
name: "chevrolet chevelle concours (sw)",
origin: 1,
weight: 4098}],


    json_from_form = [{color: 'displacement', 
              name: "name",
              x: "mpg",
              y: "acceleration"}];

这是连接两个数组的函数

$.concat||$.extend({concat:function(b,c){var a=[];for(x in arguments)a=a.concat(arguments[x]);return a}});
var new_data = $.concat(json_from_data, json_from_form);

现在我希望使用密钥

new_data获得价值
console.log(new_data);
console.log(new_data[2].color);
console.log("id", new_data.map(function(d) { return d.id}));
console.log("mpg", new_data.map(function(d) { return d.mpg}));
console.log("color", new_data.map(function(d) { return d.color}));

如果我这样做,我将收到一个未定义的解决方案。

id [90, 80, undefined] 
mpg [28, 13, undefined] 
color [undefined, undefined, "displacement"] 

如果我想从concated数组中获取值,如何避免未定义的值?

我希望有一个像

这样的解决方案
id [90, 80] 
mpg [28, 13] 
color ["displacement"] 

这是我的DEMO

3 个答案:

答案 0 :(得分:0)

只需编写一个过滤函数,如下所示:

function test(arr) {

    return arr.filter(function(ele) {

        return ele !== undefined;
    });
}

http://jsfiddle.net/j89aB/

答案 1 :(得分:0)

这似乎来自您的map()函数,而不是您的数组连接。您的map()函数似乎返回undefined,然后将其包含在您看到的结果数组中。

大多数标准方式是filter() map结果,以排除未定义的值。

var isDefined = function(v) {return v !== undefined;}
console.log("id", new_data.map(function(d) { return d.id}).filter( isDefined) );
console.log("mpg", new_data.map(function(d) { return d.mpg}).filter( isDefined) );
console.log("color", new_data.map(function(d) { return d.color}).filter( isDefined) );

或者你可以创建一个“mapValuesOnly()”函数来组合这两种行为。

function mapValuesOnly (arr, func) {
    var results = arr.map( func);
    results = results.filter( 
        function(v) {return v !== undefined;});
    return results;
}

答案 2 :(得分:0)

过滤器是解决方案之一。但是问题出在您的concat / extents代码中。让我们使用lodash(_)看看如何完成。

要遵循的步骤:

1)从两个数组中找到所有唯一键

let uniqueKeys = _.uniq([...(_.keys(json_from_data[0])), ...(_.keys(json_from_data[0]))])

这将返回

  

[“加速度”,“气缸”,“排量”,“马力”,“ id”,“ model_year”,“ mpg”,“名称”,“原点”,“重量”]

2)合并两个数组数据

let mergedData = [...json_from_data, ...json_from_form]

这将返回 [{加速度:15,汽缸:4,排量:98,马力:80,内径:90,...}  {加速度:14,汽缸:8,排量:307,马力:130,id:80,…}  {颜色:“位移”,名称:“名称”,x:“ mpg”,y:“加速度”}]

3)let newdata = []; uniqueKeys.forEach((keyy) => { let arr = []; mergedData.forEach(item => { if (item[keyy]) { arr.push(item[keyy]); } }) newdata.push({ [keyy]: arr }) })

这将返回:

  

[{“ acceleration”:[15,14]},{“ cylinders”:[4,8]},{“ displacement”:[98,307]},{“ horsepower”:[80,130]},{“ id“:[90,80]},{” model_year“:[72,72]},{” mpg“:[28,13]},{” name“:[”道奇小马(sw)“,”雪佛兰chevelle concours(sw)“,” name“]},{” origin“:[1,1]},{” weight“:[2164,4098]}]

我希望这行得通!