d3 adding data attribute conditionally

后端 未结 5 1392
悲&欢浪女
悲&欢浪女 2021-02-01 14:01

I\'m creating a table with d3 to be used by the FooTable jquery plugin and this requires having some data- attributes in the header row. But not all columns have all the data a

5条回答
  •  一个人的身影
    2021-02-01 14:37

    You don't need to call each() or filter()... The attr() function will do this for you internally. Just call it with a function instead of a value, and have that function return the desired value for each datum, or null if the attribute is not desired for a particular datum, like so:

    ...
    .attr('data-class', function(d) {
        return 'data-class' in d ? d['data-class'] : null;
    });
    

    If your function returns null, the attribute is not added. You can even combine several attributes into one call by providing a map of attr names to functions like so:

    ...
    .attr({
        'data-class': function(d) {
            return 'data-class' in d ? d['data-class'] : null;
        }, 
        'data-hide': function(d) {
            return 'data-hide' in d ? d['data-hide'] : null;
        },
        'data-ignore': function(d) {
            return 'data-ignore' in d ? d['data-ignore'] : null;
        }
    });
    

    or if you're like me and would rather not type so much, you can reduce the list of attribute names into the appropriate map:

    ...
    .attr(['data-class', 'data-hide', 'data-ignore'].reduce(function(result, attr) {
        result[attr] = function(d) {
            return attr in d ? d[attr] : null;
        }
        return result;
    }, {}));
    

提交回复
热议问题